为了创建一个JTree并通过只知道字符串路径插入新节点,我写了以下几行:
private JFrame frame;
JTree tree;
DefaultMutableTreeNode root;
DefaultTreeModel model;
public static void main(String[] args)
{
test t = new test();
t.add_new_folder("Data","trial 0");
t.add_new_folder("Data/trial 0","trial 1");
t.frame.revalidate();
t.frame.repaint();
}
public test()
{
frame = new JFrame();
tree = new JTree();
root = new DefaultMutableTreeNode("Data");
model = new DefaultTreeModel(root);
tree.setModel(model);
frame.getContentPane().add(tree, BorderLayout.WEST);
frame.setVisible(true);
frame.setSize(500, 500);
}
直到这里一切看起来都很好并且正在工作但是当这个方法被调用时它没有做到预期的结果
public void add_new_folder(String path,String name){
String[] data = path.split("/");
TreePath t = new TreePath(data);
DefaultMutableTreeNode parent = new DefaultMutableTreeNode(t);
model.insertNodeInto(new DefaultMutableTreeNode(name), parent, parent.getChildCount());
model.reload();
}
这就是我得到的东西
如何解决呢?
答案 0 :(得分:4)
试试这段代码:
public class Test {
private JFrame frame;
JTree tree;
DefaultMutableTreeNode root;
DefaultTreeModel model;
private Map<String, DefaultMutableTreeNode> treeMap;
public static void main(String[] args)
{
Test t = new Test();
t.add_new_folder("Data","trial 0");
t.add_new_folder("Data/trial 0","trial 1");
t.frame.revalidate();
t.frame.repaint();
}
public Test()
{
frame = new JFrame();
tree = new JTree();
root = new DefaultMutableTreeNode("Data");
model = new DefaultTreeModel(root);
tree.setModel(model);
frame.getContentPane().add(tree, BorderLayout.WEST);
frame.setVisible(true);
frame.setSize(500, 500);
treeMap = new HashMap<>();
treeMap.put("Data", root);
}
public void add_new_folder(String path,String name){
DefaultMutableTreeNode currentNode = treeMap.get(path);
DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(name);
currentNode.add(childNode);
treeMap.put(path+"/"+name, childNode);
model.reload();
}
}
我知道它是不是你想要的,但它可能是一个导致跟随;)
答案 1 :(得分:3)
尝试遍历特定节点并获取TreePath。下面的代码可以帮助你。
public void add_new_folder(String path,String name){
String[] data = path.split("/");
TreePath tPath = findPath(data[data.length-1]);
if(tPath != null){
((DefaultMutableTreeNode)tPath.getLastPathComponent()).add(new DefaultMutableTreeNode(name));
}
}
@SuppressWarnings("unchecked")
private TreePath findPath(String s) {
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration();
while (e.hasMoreElements()) {
DefaultMutableTreeNode node = e.nextElement();
if (node.toString().equalsIgnoreCase(s)) {
return new TreePath(node.getPath());
}
}
return null;
}