Обновление ImageIcon в JTree без перерисовки дерева? - PullRequest
1 голос
/ 02 декабря 2011

В основном я редактирую атрибут private string status="OK" в UserObject() из DefaultTreeNode().

У меня есть CustomRenderer, который implements DefaultCellRenderer, который устанавливает значок, отображая атрибут "OK" UserObject из TreeNode.

Изначально, когда я выбираю узел, значок меняется.Я использую Tree.revalidate() & Tree.repaint(), и изменение отражается.

Однако я не уверен, насколько это эффективно.Каков будет правильный способ сделать это?Я попытался сделать TreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject)), но TreeNodeChanged event не сработает.

Так что я застрял в перерисовке всего дерева каждый раз, когда пользовательский объект TreeNode изменяется, чтобы увидеть графическое обновление?

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Используйте подход, показанный в TreeIconDemo2, чтобы подготовить визуализатор на основе значения модели. Например,

private class MyRenderer extends DefaultTreeCellRenderer {

    private Icon okIcon;

    public MyRenderer(Icon okIcon) {
        this.okIcon = okIcon;
    }

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(
            tree, value, sel, exp, leaf, row, hasFocus);
        YourMutableTreeNode node = (YourMutableTreeNode) value;
        if (leaf && node.getStatus().equals("OK")) {
            setIcon(okIcon);
        }
        return this;
    }
}

Приложение: Вы не можете просто вызвать nodeChanged() для нового TreeNode, который не является частью дерева; новый узел не имеет родителя. Если вы указываете существующий узел на nodeChanged(), уведомление будет происходить автоматически. Если нужно, есть пример поиска дерева здесь .

2 голосов
/ 02 декабря 2011

Когда вы хотите обновить модель, как вы делаете здесь, вы правы, что хотите вызвать nodeChanged.То, что я думаю, может быть неправильным, это то, что вы переходите в совершенно новый узел, который явно не совпадает с найденным в дереве.Попробуйте передать ссылку на узел в дереве, которое вы изменили, - так модель сможет узнать, какой узел вы изменили.

...