Я работал над переводом Java-приложения с WindowsLookAndFeel на Nimbus, в основном успешно, несмотря на недостатки Nimbus. Моим пользователям в целом нравится Nimbus LaF, но им не нравятся некоторые детали, некоторые из которых я изменил, ознакомившись с предыдущими вопросами на этом сайте. Пример :Я скопировал LeafIcon, ClosedIcon и OpenIcon из Windows LaF (, который им понравился ), и использовал их в версии Nimbus, для хорошей комбинации LaF.
Застрял на последнем (? )проблема.
У меня есть JTree с подклассом DefaultCellRenderer для создания соответствующих отображений узлов. Это прекрасно работает под WindowsLookAndFeel.
Проблема :В WindowsLaF при выборе узла текст узла выделяется, и эффект визуально легко понять. В Nimbus, когда выбран узел, выделение выполняется полосой (довольно темного )цвета, которая проходит по ширине окна дерева (, а не только по ширине текста ), и эффект сбивающий с толку.
Таким образом, :я просто хочу, чтобы WindowsLaF использовал подсветку узлов JTree в Nimbus LaF (, т.е. окрашивал фон только по ширине текста и желательно в лучшем цвете, который я могу выбрать ). Я подозреваю, что это означает, что мне нужно назначить правильный вид Painter для "Tree :TreeCell[Focused+Selected].backgroundPainter", но я не знаю, как это написать.
Приветствуются предложения.
РЕДАКТИРОВАТЬ
Обратите внимание на странную подсветку выбранного узла в 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);
}
}
}