Java Swing:JTree DefaultMutableTreeNode 未更新
Java Swing: JTree DefaultMutableTreeNode not updating
我最近一直在做一个 Java Swing 项目,今天我在修改 DefaultMutableTreeNode
的子项时卡住了。
下面的 SSCCE 说明了这个问题:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class Test
{
private static boolean executed = false;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
final JTree tree = new JTree(root);
tree.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent ev)
{
if (ev.getClickCount() == 2)
{
root.removeAllChildren();
for (String s: get())
{
root.add(new DefaultMutableTreeNode(s));
System.out.println(s + " added");
}
System.out.println();
tree.expandPath(tree.getSelectionPath());
}
}
});
frame.add(tree);
frame.setSize(200,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
static String[] get()
{
if (!executed)
{
executed = true;
return new String[]{"a","b","c"};
}
else return new String[]{"a","b","c","d"};
}
}
如您所见,第一次调用 get()
方法时,它 returns 一个 3 元素数组,之后是一个 4 元素数组。当我第一次双击(实际上按下)根节点时,应该有三个子节点(a、b 和 c),并且程序按预期运行。当我再次双击根节点时,我想它会有四个子节点。然而事实并非如此。第二次双击时子节点还是只有三个,不是四个。
我弄错了吗?预先感谢您的帮助。
您应该使用 reload()
方法通知模型有关更改
在 expand path
之前添加此行,如下所示
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.reload(root); // notify changes to model
tree.expandPath(tree.getSelectionPath());
我最近一直在做一个 Java Swing 项目,今天我在修改 DefaultMutableTreeNode
的子项时卡住了。
下面的 SSCCE 说明了这个问题:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class Test
{
private static boolean executed = false;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
final JTree tree = new JTree(root);
tree.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent ev)
{
if (ev.getClickCount() == 2)
{
root.removeAllChildren();
for (String s: get())
{
root.add(new DefaultMutableTreeNode(s));
System.out.println(s + " added");
}
System.out.println();
tree.expandPath(tree.getSelectionPath());
}
}
});
frame.add(tree);
frame.setSize(200,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
static String[] get()
{
if (!executed)
{
executed = true;
return new String[]{"a","b","c"};
}
else return new String[]{"a","b","c","d"};
}
}
如您所见,第一次调用 get()
方法时,它 returns 一个 3 元素数组,之后是一个 4 元素数组。当我第一次双击(实际上按下)根节点时,应该有三个子节点(a、b 和 c),并且程序按预期运行。当我再次双击根节点时,我想它会有四个子节点。然而事实并非如此。第二次双击时子节点还是只有三个,不是四个。
我弄错了吗?预先感谢您的帮助。
您应该使用 reload()
方法通知模型有关更改
在 expand path
之前添加此行,如下所示
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.reload(root); // notify changes to model
tree.expandPath(tree.getSelectionPath());