Изменить значки JTree на основе пользовательских состояний объекта

1

У меня есть 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. Любое решение? Благодаря :)

  • 0
    Почему вы не можете привести value в JTreePanelNode ?
Теги:
swing
jtree
treecellrenderer

2 ответа

4

Все зависит от вашего класса 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().

  • 0
    Большое спасибо. Я не осознавал, что «значение» - это представление узла, которое я могу привести к своему собственному классу.
  • 0
    np, если бы вы опубликовали свой специальный класс узлов дерева, мы могли бы дать вам небольшой рабочий пример, который также будет полезен для других.
Показать ещё 2 комментария
2

вы можете получить доступ к объекту, представленному в этом дереве:

@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 ;
}
  • 1
    Хотя это технически правильно, это предполагает конкретную реализацию. Что если OP не использует DefaultMutableTreeNode ?
  • 0
    хехехе - да, вы очень правы и хороший наблюдатель !! я глубоко впечатлен !! я предполагаю, что пользователь следует по следу на docs.oracle.com/javase/tutorial/uiswing/components/tree.html ... но я не могу этого гарантировать !! очень консервативен, продолжайте в том же духе =)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню