JTree TreeCellRenderer поднимает проблему при отображении цвета выделения - PullRequest
3 голосов
/ 29 января 2012

Я использую этот фрагмент кода ниже:

 class CountryTreeCellRenderer implements TreeCellRenderer {
        private JLabel label;

        CountryTreeCellRenderer() {
            label = new JLabel();
        }

        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
            Object o = ((DefaultMutableTreeNode) value).getUserObject();
            if (o instanceof Country) {
                Country country = (Country) o;
                label.setIcon(new ImageIcon(country.getFlagIcon()));
                label.setText(country.getName());
            } else {
                label.setIcon(null);
                label.setText("" + value);
            }
            return label;
        }
    }

Поскольку я передаю / возвращаю метку, поэтому при выборе любого компонента в JTree цвет выделения не приходит.Я пытался использовать:

JComponent comp = (JComponent) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
comp.setOpaque(true);
if(selected)
comp.setBackground(Color.RED);

Но если я верну comp, то вывод дерева не идет, как ожидалось.

Как решить то же самое?1012 * Я не реализовал никакой редактор для того же.

Ответы [ 2 ]

3 голосов
/ 29 января 2012

Пожалуйста, посмотрите на исходный код DefaultTreeCellRenderer, который также расширяет JLabel и прекрасно способен устанавливать цвет фона.Я скопировал соответствующие строки ниже:

  if (selected)
    {
      super.setBackground(getBackgroundSelectionColor());
      setForeground(getTextSelectionColor());

      if (hasFocus)
        setBorderSelectionColor(UIManager.getLookAndFeelDefaults().
                                getColor("Tree.selectionBorderColor"));
      else
        setBorderSelectionColor(null);
    }
  else
    {
      super.setBackground(getBackgroundNonSelectionColor());
      setForeground(getTextNonSelectionColor());
      setBorderSelectionColor(null);
    }
0 голосов
/ 01 февраля 2012

Да, это сработало, как объяснил Робин.

if(selected){
            label.setBackground(Color.YELLOW);
            label.setForeground(Color.GREEN);
        }else
             {
            label.setBackground(Color.WHITE);
            label.setForeground(Color.BLACK);
             //setBorderSelectionColor(null);
             }

достаточно

...