I have a very basic JTree
. As I am on a rush, I'd prefer not to use TreeModel
if it is not needed. I wrote a SSCCE to expose the problem:
我有一个非常基本的JTree。因为我匆忙,如果不需要,我宁愿不使用TreeModel。我写了一个SSCCE来揭露这个问题:
Sometimes I add a node. Other times I remove them. When I push Add
, a node is correctly added. When I push Remove
, it is supposed to remove the node, but it doesn't. Also, if I try adding more than one node, the tree stays with just the first node I added.
有时我会添加一个节点。其他时候我删除它们。当我按下Add时,正确添加了一个节点。当我推送删除时,它应该删除节点,但它不会。此外,如果我尝试添加多个节点,树只会保留我添加的第一个节点。
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++;
}
}
}
1 个解决方案
#1
46
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. In which case you would need to do the reload().
或者,您可以使用DefaultMutableTreeNode类的remove(...)方法。在这种情况下,您需要执行reload()。
#1
46
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. In which case you would need to do the reload().
或者,您可以使用DefaultMutableTreeNode类的remove(...)方法。在这种情况下,您需要执行reload()。