1

カスタム TreeCellRenderer を持つ JTree があります。

      DefaultMutableTreeNode myTreeRoot = new DefaultMutableTreeNode();
      JTree myTree = new JTree(myTreeRoot);
      myTree.setCellRenderer(new DefaultTreeCellRenderer() {

             @Override
             public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
                     if (((DefaultMutableTreeNode) value).getUserObject() instanceof MyObject) {
                             System.out.println("============= my object ===========" + value);
                     }
                     return super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
             }
      });

次に、表示後にツリーにノードを動的に追加します。子を 1 人だけ追加する場合を考えてみましょう。

      MyObject object = new MyObject("Child Node");
      DefaultMutableTreeNode myTreeNode = new DefaultMutableTreeNode(object);
      myTreeRoot.add(myTreeNode);

次に、ツリーのルートも非表示にします

      myTree.expandRow(0);
      myTree.setRootVisible(false);
      myTree.setShowsRootHandles(true);
      if (myTreeRoot.getChildCount() != 0) {
            myTree.setSelectionRow(0);
      } 
      SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                   devicesTree.updateUI();
            }
      });

後でこれらのノードを削除する別のオプションがあります

      private void removeNode(MyObject object) {
            DefaultMutableTreeNode myTreeNode = getTreeeNode(object); //This method traverse through the tree and returns the corresponding node
            DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) myTree.getSelectionPath().getLastPathComponent();
            int selectedRow = -1;
            if (myTree.getSelectionRows().length > 0) {
                  selectedRow = myTree.getSelectionRows()[0];
            }
            boolean isSelected = selectedNode == myTreeNode;

            if (isSelected) {
                  if (myTree.getRowCount() == 1) {
                         myTree.clearSelection();
                  } else if (myTree.getRowCount() > selectedRow + 1) {
                         myTree.setSelectionRow(selectedRow + 1);
                  } else if (selectedRow != 0) {
                         myTree.setSelectionRow(0);
                  }
            }

            DefaultMutableTreeNode parent = (DefaultMutableTreeNode) myTreeNode.getParent();
            parent.remove(myTreeNode);
            SwingUtilities.invokeLater(new Runnable() { 
                  public void run() {
                        myTree.updateUI();
                  }
            });
      }

今私が抱えている問題は、ツリーのルートに子が 1 つしかなく、その子を削除することを選択した場合、削除後も getTreeCellRendererComponent() メソッドがその削除されたオブジェクトを指していることです。その手がかりはありますか?

4

0 に答える 0