изменение того, как Nimbus LaF обрабатывает подсветку узлов JTree

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

enter image description here

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);
        }
    }
}
8
задан oliholz 17 December 2012 в 15:13
поделиться