У меня есть JTree, основанный на нескольких пользовательских классах. Я хочу указать несколько Узлов на определенный значок. Поэтому я сделал следующий код на основе этой ссылки: динамически меняет значок определенных узлов в JTree
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() {
private static final long serialVersionUID = 1L;
private Icon good = new ImageIcon(getClass().getResource("/good.png"));
private Icon dunno = new ImageIcon(getClass().getResource("/dunno.png"));
private Icon bad = new ImageIcon(getClass().getResource("/bad.png"));
@Override
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean isLeaf, int row, boolean focused) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
// JTreePanelNode node = (JTreePanelNode)c; - not possible
return c;
}
};
this.getTree().setCellRenderer(renderer);
Каждый из моих узлов является объектом JTreePanelNode (пользовательский класс), который сохраняет определенное состояние, которое может быть установлено через setState (String s) и получить через getState(). Так что я хочу, чтобы что-то вроде этого:
if(node.getState().equals("good")) ..
else if(node.getState.equals("bad")) ..
else ..
Как я могу добиться чего-то подобного? Из того, что я понимаю, рендеринг проходит через каждый узел с помощью getTreeCellRendererComponent и применяет конкретный значок, который я могу выбрать с помощью setIcon и нескольких ifs(). Однако я не могу использовать JTreePanelNode. Любое решение? Благодаря :)
Все зависит от вашего класса JTreePanelNode. если он реализует интерфейс TreeNode, с которым вы можете пойти:
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component comp = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
row, hasFocus);
TreeNode current = (TreeNode)value;
if (leaf) {
//set leaf icon
} else if (expanded) {
//set expanded icon
} else {
// set default state
}
if (hasFocus)
//set what it looks like if focused
else if (selected)
//set what it looks like if selected
else
//set default l&f
comp.setIcon(whatevericonset in above conditions);
return comp;
}
Конечно, вы можете добавить еще много состояний в зависимости от вашего класса node.getState().
вы можете получить доступ к объекту, представленному в этом дереве:
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
DefaultMutableTreeNode node = (DefaultMutableTreeNode ) value;
Object representedObject = node.getUserObject();
JLabel superLabel = super.getTreeCellRendererComponent();
String text = label.getText();
if(object.isGood() ){ //i don't know your code
superLabel .setText (text +"goooooooood");
}else{
superLabel .setText (text +"badbadbabd");
}
return superLabel ;
}
DefaultMutableTreeNode
?
value
вJTreePanelNode
?