Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTree在删除节点后不更新_Java_Eclipse_Swing_Jtree - Fatal编程技术网

Java JTree在删除节点后不更新

Java JTree在删除节点后不更新,java,eclipse,swing,jtree,Java,Eclipse,Swing,Jtree,我试图从JTree中删除节点,我有两个代码 这个代码正在运行 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

我试图从JTree中删除节点,我有两个代码 这个代码正在运行

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();
    //scrolltree is basically a panel contains class has JTree
    scrolltree st = new scrolltree();
    t.frame.add(st);
    JButton b = new JButton("remove node");
    t.frame.add(b, BorderLayout.SOUTH);
    b.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            DefaultTreeModel model = (DefaultTreeModel) st.getTree().getTree().getModel();
            String key = new currentfolder().getCurrentfolder() + "/" + "a3.png";
            System.out.println(key);
            model.removeNodeFromParent(st.getTree().getTreeMap().get(key));
        }
    });
    t.frame.revalidate();
    t.frame.repaint();

}

public test() {
    frame = new JFrame();
    frame.setVisible(true);
    frame.setSize(500, 500);
}
我的类树如下所示

public class tree {
JTree tree;
DefaultMutableTreeNode node1;
DefaultTreeModel model;
String name = new currentfolder().getInitial();// path to directory that its
                                                // content appear in tree
private Map<String, DefaultMutableTreeNode> treeMap;

public tree() {
    tree = new JTree();
    tree.setExpandsSelectedPaths(true);
    node1 = new DefaultMutableTreeNode(name);
    model = new DefaultTreeModel(node1);
    tree.setModel(model);
    treeMap = new HashMap<>();
    treeMap.put(name, node1);
    //method to inset many other nodes
    import_data(new File(name), node1);

    model.reload();
    tree.setOpaque(false);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setBorder(javax.swing.BorderFactory.createCompoundBorder(
            new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED),
            javax.swing.BorderFactory.createTitledBorder("")));
    tree.setVisible(true);
公共类树{
JTree树;
默认可变树节点1;
DefaultTreeModel模型;
String name=new currentfolder().getInitial();//所属目录的路径
//内容显示在树中
私有地图树图;
公树(){
tree=newjtree();
tree.setExpandsSelectedPath(true);
node1=新的DefaultMutableTreeNode(名称);
模型=新的DefaultTreeModel(节点1);
tree.setModel(model);
treeMap=newhashmap();
树映射put(名称、节点1);
//方法插入许多其他节点
导入_数据(新文件(名称),节点1);
model.reload();
tree.set不透明(false);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_tree_SELECTION);
setboorder(javax.swing.BorderFactory.createCompoundBorder(
新建javax.swing.border.SoftBevelOrder(javax.swing.border.BevelOrder.RAISED),
javax.swing.BorderFactory.createTitledBorder(“”);
tree.setVisible(true);
当我做
tree t=newtree;
然后把它放在老树上就行了

我怎样才能解决这个问题以及解释为什么它不起作用?谢谢

当我用
SwingUtilites.invokeLater()
替换所有这些时,它起了作用。我不明白为什么


正如所建议的,确保仅在上构造和操作Swing GUI对象​. 特别是,从另一个线程更新
TreeModel
意味着侦听
JTree
视图可能会以某种意外的顺序接收更新,或者根本不接收更新。

@trashgod您可以检查这个问题吗?首先,确保只在上构造和操作Swing GUI对象。为了更好地帮助,请尽快发布SSCCE/MCVE,简称,通过使用UIManager中的图标,可以运行、编译model.removeNodeFromParent(startframe.getScrolltree().getTree().getTree().getTreeMap().get(key));无法正常工作(意味着JTree/treemodel中的通知程序……),只需猜测t.frame.revalidate()和t.frame.repaint()的原因;(更多内容由@trashgood在评论中解释)@mKorbel这只是为了在添加新的swing组件后进行更新,是的,我最好使用swing实用程序,谢谢这一点
public class tree {
JTree tree;
DefaultMutableTreeNode node1;
DefaultTreeModel model;
String name = new currentfolder().getInitial();// path to directory that its
                                                // content appear in tree
private Map<String, DefaultMutableTreeNode> treeMap;

public tree() {
    tree = new JTree();
    tree.setExpandsSelectedPaths(true);
    node1 = new DefaultMutableTreeNode(name);
    model = new DefaultTreeModel(node1);
    tree.setModel(model);
    treeMap = new HashMap<>();
    treeMap.put(name, node1);
    //method to inset many other nodes
    import_data(new File(name), node1);

    model.reload();
    tree.setOpaque(false);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setBorder(javax.swing.BorderFactory.createCompoundBorder(
            new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED),
            javax.swing.BorderFactory.createTitledBorder("")));
    tree.setVisible(true);