Обновление ImageIcon в JTree без перекраски дерева?

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

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

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

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

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

Используйте подход, показанный в 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() , уведомление будет происходить автоматически. При необходимости здесь есть пример поиска дерева.

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

  • Доступ к компонентам GUI из другого classа
  • Возможно ли иметь автозаполнение с использованием jtextfield и Jlist?
  • Автозаполнение JComboBox
  • Может ли индикатор выполнения работать в classе за пределами основного?
  • JAR Bundler с использованием OSXAdapter, заставляющий приложение запаздывать или заканчиваться
  • Изменение размера изображения и отображение в JPanel или JLabel без потери качества
  • DocumentListener Java, Как предотвратить пустую строку в JTextBox?
  • Сохранение графического изображения Java 2d как .png-файла
  • Java Bouncing Ball
  • Java AWT / SWT / Swing: как планировать графический интерфейс?
  • Изображения в paintComponent отображаются только после изменения размера windows
  • Давайте будем гением компьютера.