简体   繁体   English

在JTree中添加和删除节点

[英]Adding and removing nodes from a JTree

I have a very basic JTree . 我有一个非常基本的JTree As I am on a rush, I'd prefer not to use TreeModel if it is not needed. 因为我匆忙,如果不需要,我宁愿不使用TreeModel I wrote a SSCCE to expose the problem: 我写了一个SSCCE来揭露这个问题:

Sometimes I add a node. 有时我会添加一个节点。 Other times I remove them. 其他时候我删除它们。 When I push Add , a node is correctly added. 当我按下Add ,会正确添加节点。 When I push Remove , it is supposed to remove the node, but it doesn't. 当我推送Remove ,它应该删除节点,但它不会。 Also, if I try adding more than one node, the tree stays with just the first node I added. 此外,如果我尝试添加多个节点,树只会保留我添加的第一个节点。

I wrote an update method for the JTree , where I first erase all the nodes hanging from the root node, and then I look at which nodes and sub-nodes I have to create. 我为JTree编写了一个更新方法,首先擦除从根节点挂起的所有节点,然后查看我必须创建的节点和子节点。

What I am doing wrong here, apart from not using a TreeModel to operate into the tree? 除了不使用TreeModel操作树之外,我在这里做错了什么?

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;


public class TreeTest {
    private JFrame myFrame;
    private JTree myTree;
    private JButton addButton, removeButton;

    private int numberOfNodes;
    private DefaultMutableTreeNode rootNode;

    private ArrayList<String> graphicIDS;
    private ArrayList<String> graphicInfo;

    public static void main (String [ ] args){
        new TreeTest();
    }

    public TreeTest() {
        graphicIDS = new ArrayList<String>();
        numberOfNodes = 0;
        graphicInfo = new ArrayList<String>();
        graphicInfo.add("Info A");
        graphicInfo.add("Info B");
        graphicInfo.add("Info C");
        graphicInfo.add("Info D");

        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        myFrame = new JFrame("JTree test");
        myFrame.setResizable(false);
        myFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        c.fill = GridBagConstraints.BOTH;
        c.anchor = GridBagConstraints.NORTH;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 2;
        c.insets = new Insets(5,5,5,5);

        rootNode = new DefaultMutableTreeNode("Root node");
        myTree = new JTree(rootNode);
        myTree.setPreferredSize(new Dimension(200, 500));
        panel.add(myTree, c);

        c.gridwidth = 1;
        c.gridy++;
        removeButton = new JButton("Remove");
        removeButton.setEnabled(false);
        removeButton.addActionListener(new ActionListener (){
            @Override
            public void actionPerformed(ActionEvent e) {    
                System.out.println("Removed curve "+(graphicIDS.size()));
                graphicIDS.remove(graphicIDS.size()-1);
                numberOfNodes--;
                updateMeasurementsTree();
            }
        });
        panel.add(removeButton, c);

        c.gridx++;
        addButton = new JButton("Add");
        addButton.addActionListener(new ActionListener (){
            @Override
            public void actionPerformed(ActionEvent e) {
                graphicIDS.add("Curve "+(numberOfNodes+1));
                System.out.println("Added curve "+(numberOfNodes+1));
                numberOfNodes++;
                updateMeasurementsTree();
            }
        });
        panel.add(addButton, c);

        myFrame.getContentPane().add(panel);
        myFrame.pack();
        myFrame.setVisible(true);
    }

    public void updateMeasurementsTree(){
        rootNode.removeAllChildren();

        for(int i=0; i<numberOfNodes;i++){  
            String idString = graphicIDS.get(i);
            DefaultMutableTreeNode idNode = new DefaultMutableTreeNode("Graphic "+idString);
            rootNode.add(idNode);
            int randomValue = (int) Math.floor(Math.random()*graphicInfo.size());
            String infoString = graphicInfo.get(randomValue);
            DefaultMutableTreeNode infoNode = new DefaultMutableTreeNode("Info "+infoString);
            idNode.add(infoNode);
        }
        if(numberOfNodes==0) removeButton.setEnabled(false);
        else{
            removeButton.setEnabled(true);
            expandAll();
        }
    }

    public void expandAll() {
        int row = 0;
        while (row < myTree.getRowCount()) {
          myTree.expandRow(row);
          row++;
        }
    }
}

I don't know why you are deleting and recreating all the nodes. 我不知道你为什么要删除并重新创建所有节点。

Update should always be done through the model. 应始终通过模型进行更新。 You have a couple of choices: 你有几个选择:

Update the model directly: 直接更新模型:

DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
model.insertNodeInto(new DefaultMutableTreeNode("another_child"), root, root.getChildCount());

Update the tree nodes and then notify the model: 更新树节点,然后通知模型:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
root.add(new DefaultMutableTreeNode("another_child"));
model.reload(root);

The same applies for removing nodes. 这同样适用于删除节点。

The DefaultTreeModel has a removeNodeFromParent(...) which will update the model directly. DefaultTreeModel有一个removeNodeFromParent(...) ,它将直接更新模型。

Or you can use the remove(...) method of the DefaultMutableTreeNode class. 或者您可以使用DefaultMutableTreeNode类的remove(...)方法。 In which case you would need to do the reload(). 在这种情况下,您需要执行reload()。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM