2013-07-19 2 views
3

Как-то я не могу включить «выделить выделение» для своих узлов JTree. Я работаю с собственным визуализатором ячеек в своем проекте (что, скорее всего, вызывает эту проблему).Узлы JTree не будут визуально выбраны

Это полный код класса рендерер:

protected class ProfessionTreeCellRenderer extends DefaultTreeCellRenderer { 
    private final JLabel label; 

    public ProfessionTreeCellRenderer() { 
     label = new JLabel(); 

     setBackgroundSelectionColor(Color.BLUE); 
     setOpaque(true); 
    } 

    @Override 
    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 Profession) { 
      Profession profession = (Profession) o; 

      label.setIcon(profession.getIcon()); 
      label.setText(profession.getDisplayName()); 
     } else if(o instanceof NPC) { 
      label.setIcon(QuestEdit.getIcon("npc")); 
      label.setText(((NPC) o).getName()); 
     } else { 
      label.setIcon(null); 
      label.setText("" + value); 
     } 

     return label; 
    } 
} 

Я искал на StackOverflow и других сайтов для возможных решений, нашел «setOpaque» метод - вообще никаких изменений.

Я уверен, что он должен что-то сделать с помощью специального рендеринга, так как подсветка прекрасно работает в другом моем проекте.

Edit:

Удаление JLabel и добавления этих строк работал для меня:

this.selected = selected; 
this.hasFocus = hasFocus;   

if (selected) { 
    super.setBackground(getBackgroundSelectionColor()); 
    setForeground(getTextSelectionColor()); 
} else { 
    super.setBackground(getBackgroundNonSelectionColor()); 
    setForeground(getTextNonSelectionColor()); 
} 
+0

Я столкнулся с этой же проблемой и просто добавил код 'this.selected = selected; this.hasFocus = hasFocus; «Это сработало, спасибо. –

ответ

3

DefaultTreeCellRenderer расширяет JLabel, поэтому попробуйте настроить this вместо label, затем возвращаются this.

+0

Для примера [http://stackoverflow.com/a/8351850/230513). – trashgod

+0

@tbodt Спасибо за быстрый ответ, попробуем это позже! – spaceemotion

0

После переопределения метода, как показано ниже:

getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) 

Создание экземпляра JLabel с этим фрагменте кода:

JLabel label=(JLabel)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 

а затем переопределить метод public Color getBackgroundSelectionColor() к собственному цвету.