Я работаю над переходом приложения Java из WindowsLookAndFeel в Nimbus, в значительной степени успешно, несмотря на недостатки Nimbus. Мои пользователи в целом, как Nimbus LaF, но не понравились некоторые детали, некоторые из которых я изменил, обратившись к предыдущим вопросам на этом сайте. Пример: я скопировал LeafIcon, ClosedIcon и OpenIcon из Windows LaF (который им понравился) и использовал их в версии Nimbus, для приятной комбинации LaFs., изменяя, как Nimbus LaF обрабатывает выделение узлов JTree
Застрял на одной последней (?) Проблеме.
У меня есть JTree с подклассом DefaultCellRenderer для создания соответствующих отображаемых узлов. Это отлично работает под WindowsLookAndFeel.
Проблема: Под WindowsLaF, когда выбран узел, текст узла подсвечивается, и эффект визуально легко понять. Под Nimbus, когда выбран узел, выделение выполняется с помощью полосы (довольно темного) цвета, которая управляет шириной окна дерева (а не только ширины текста), и эффект сбивает с толку.
Итак: я просто хочу, чтобы обработка линз JTree с помощью WindowsLaF подчеркивалась в Nimbus LaF (т.е. цветной фон был только шириной текста и предпочтительно лучшим цветом, который я могу выбрать). Я подозреваю, что это означает, что мне нужно назначить правильную сортировку Painter на «Дерево: TreeCell [Focused + Selected] .backgroundPainter», но я не знаю, как его записать.
Предложения наиболее приветствуются.
EDIT
Смотрите странный выбранный блик узел с Java 7!
public class TreeBorder {
public static void main(String[] args) {
try{
for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch(Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(getJTree());
f.pack();
f.setVisible(true);
}
private JTree getJTree() {
JTree jTree = new JTree();
jTree.setCellRenderer(new LocalRenderer());
return jTree;
}
});
}
private static class LocalRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus) {
DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasfocus);
if(true) {
result.setFont(new JLabel().getFont());
Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
result.setIcon(icon);
}
return(result);
}
}
}
Добавление к моей публикации: конечно, если есть более простой способ, чем художник, это будет еще лучше. Попробовал просто изменить Tree.selectionBackground на менее отвлекающий цвет, но Nimbus, похоже, игнорирует модификацию. – user1359010
В дополнение к моему комментарию. Вы не можете установить Tree.selectionBackground напрямую, но этот цвет получен из numbusSelectionBackground, поэтому nimbUID.put («nimbusSelectionBackground», новый ColorUIResource (205,208,216)); производит некоторый желаемый эффект (более легкий Tree.selectionBackground). Все еще получая выделенную строку, а не только текст, так что помощь художнику все равно будет оценена. – user1359010
@oliholz, пожалуйста, можете прокомментировать свою щедрость, конечно, я никогда не увижу этого вопроса, потому что классическая концепция Renderers перегружает свойства и настройки Nimbus в большинстве случаев – mKorbel