Я работал над переводом 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);
}
}
}