2012-04-26 4 views
8

Я работаю над переходом приложения 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!

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); 
     } 
    } 
} 
+0

Добавление к моей публикации: конечно, если есть более простой способ, чем художник, это будет еще лучше. Попробовал просто изменить Tree.selectionBackground на менее отвлекающий цвет, но Nimbus, похоже, игнорирует модификацию. – user1359010

+0

В дополнение к моему комментарию. Вы не можете установить Tree.selectionBackground напрямую, но этот цвет получен из numbusSelectionBackground, поэтому nimbUID.put («nimbusSelectionBackground», новый ColorUIResource (205,208,216)); производит некоторый желаемый эффект (более легкий Tree.selectionBackground). Все еще получая выделенную строку, а не только текст, так что помощь художнику все равно будет оценена. – user1359010

+0

@oliholz, пожалуйста, можете прокомментировать свою щедрость, конечно, я никогда не увижу этого вопроса, потому что классическая концепция Renderers перегружает свойства и настройки Nimbus в большинстве случаев – mKorbel

ответ

6

Редактировать

Ключ "Tree.selectionBackground" является то, что контролирует блик на 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; 
} 

А вот пример изменения подсветки на красный. Обратите внимание, что фон значка также будет выделен - это поведение по умолчанию для non-nimbus L & 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); 
    } 

Оригинал ответа

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

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

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

+0

Хм ... на самом деле, поскольку я понял вопрос о предотвращении цвета фона _outside_ средства визуализации (сохраняя его _inside_) Использование невидимого цвета (если оно вообще имеет какой-либо эффект) предотвратит оба. – kleopatra

+0

@ kleopatra Хе-хе ... возможно, я прочитаю полный вопрос в следующий раз. Хороший улов. –

+0

ОП здесь; только что вернулся после долгого времени, в восторге от ответа на вопрос, и он работает. Большое спасибо за код и информацию о том, что он обрабатывается на уровне дерева. – user1359010