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

8

Я работал над переводом приложения Java с WindowsLookAndFeel на Nimbus, в значительной степени успешно, несмотря на недостатки Nimbus. Моим пользователям в целом нравится Nimbus LaF, но не понравились некоторые детали, некоторые из которых я изменил, просмотрев предыдущие вопросы на этом сайте. Пример: я скопировал LeafIcon, ClosedIcon и OpenIcon из Windows LaF (которая им понравилась) и использую их в версии Nimbus для хорошей комбинации LaF.

Застрял на одной последней (?) Проблеме.

У меня есть JTree с вложенным классом DefaultCellRenderer для создания соответствующих отображений узлов. Это прекрасно работает под WindowsLookAndFeel.

Проблема: В WindowsLaF, когда выбран узел, текст узла выделяется, и эффект визуально легко понять. В разделе Nimbus, когда выбран узел, выделение выполняется полосой (довольно темного) цвета, которая определяет ширину окна дерева (а не только ширину текста), и эффект вызывает недоумение.

Итак: я просто хочу, чтобы WindowsLaF обрабатывал подсветку узлов JTree в Nimbus LaF (т. Е. Окрашивал фон только шириной текста, и желательно в лучшем цвете, который я могу выбрать). Я подозреваю, что это означает, что мне нужно назначить правильный вид Painter для & quot; Tree: TreeCell [Focused + Selected] .backgroundPainter & quot ;, но я не знаю, как его написать.

Предложения приветствуются.


EDIT

Посмотрите на странный выделенный узел с помощью 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);
        }
    }
}
Приложение к моей публикации: конечно, если есть более простой способ, чем художник, это было бы еще лучше. Попытался просто изменить Tree.selectionBackground на менее отвлекающий цвет, но Nimbus, похоже, игнорирует модификацию. user1359010
@oliholz, пожалуйста, не могли бы вы прокомментировать свою награду, уверен, что я никогда не видел этот вопрос, потому что классическая концепция Renderers перегружает свойства и настройки Nimbus в большинстве случаев mKorbel
@mKorbel eee Редактировать. С DefaultTreeCellRenderer и Java7 я получил раздражающую изюминку под Nimbus. oliholz
Ошибка Nimbus исправлена в Java 8, и это исправление больше не работает. oliholz
В дополнение к моему комментарию. Вы не можете напрямую установить Tree.selectionBackground, но этот цвет является производным от numbusSelectionBackground, поэтому nimbUID.put (& quot; nimbusSelectionBackground & quot ;, new ColorUIResource (205,208,216)); производит некоторый желаемый эффект (более легкий Tree.selectionBackground). По-прежнему выделяется строка, а не только текст, так что помощь художнику все равно будет оценена. user1359010

Ваш Ответ

1   ответ
6

Edit

& Quot; Tree.selectionBackground & quot; ключ - это то, что управляет подсветкой на JTree - это делается на уровне дерева, а не на уровне TreeCellRenderer (поэтому управлять им немного сложно). Этот код даст вам дерево, где вы можете управлять подсветкой:

private JTree getJTree() {

    JTree jTree = new JTree();
    jTree.setOpaque(true);
    jTree.setBackground(Color.white);
    UIDefaults paneDefaults = new UIDefaults();
    paneDefaults.put("Tree.selectionBackground",null);

    JTextPane pane = new JTextPane();
    jTree.putClientProperty("Nimbus.Overrides",paneDefaults);
    jTree.putClientProperty("Nimbus.Overrides.InheritDefaults",false);

    jTree.setCellRenderer( new LocalRenderer() );
    return jTree;
}

А вот пример изменения выделения на красный. Обратите внимание, что фон значка также будет выделен - это поведение по умолчанию для не nimbus L & amp; F. Если вы не хотите, чтобы значок выделялся, вам придется использовать что-то более изумительное, чем стандартная JLabel, для визуализации TreeCell:

    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 );
        result.setOpaque(true);
            if( true ) {
                result.setFont( new JLabel().getFont() );
                Icon icon = UIManager.getIcon("FileView.floppyDriveIcon");
                result.setIcon( icon );
            }
            if(sel){
                result.setBackground(Color.red);
            } else{
                result.setBackground(Color.white);
            }
        return(result);
    }

Original Answer

Один из самых простых способов исправить это - установить выбранный цвет фона на прозрачный. Проблема состоит в том, что он пытается нарисовать фон метки - у которого нет классного художника Nimbus, используемого выбором JTree. Так что добавьте эту строку вgetTreeCellRendererComponent метод:

result.setBackgroundSelectionColor(new Color(0,0,0,0));

Другой вариант - использовать средство рисования нимба для фона TreeCellRenderer - но в этой ситуации это кажется излишним.

Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededoutsideError: User Rate Limit ExceededinsideError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user1359010
Error: User Rate Limit Exceededstackoverflow.com/questions/28691272/…Error: User Rate Limit Exceeded user1359010
Error: User Rate Limit Exceeded

Похожие вопросы