Обновление 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. Возможно, я ошибаюсь в том, что вы проходите в совершенно новом узле, который, очевидно, не соответствует найденному в дереве. Попробуйте передать ссылку на узел в дереве, который вы изменили – таким образом модель может узнать, какой узел вы изменили.

  • Как установить AUTO-SCROLLING JTextArea в Java GUI?
  • Должны ли мы использовать EventQueue.invokeLater для любого обновления графического интерфейса пользователя в настольном приложении Java?
  • Разница между paint () и paintcomponent ()?
  • Таблица сортировки неверна при нажатии кнопки сортировки более одного раза?
  • Как получить значок из JTable
  • Как поддерживать JTable-рендеринг ячейки после редактирования ячейки
  • Настройка Tree.collapsedIcon для одного JTree
  • «Всегда поверх» Windows с Java
  • Есть ли способ принять только числовые значения в JTextField?
  • Позиции и размеры JPanel изменяются в соответствии с экранами
  • Создание надежного масштабируемого графического интерфейса Swing Chess
  • Давайте будем гением компьютера.