简体   繁体   English

删除节点后JTree不更新

[英]JTree doesn`t update after removing node

I am trying to remove node from JTree and i have two codes That code is working 我正在尝试从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);
}

and that code removes it perfectly and updated it too 该代码完美地删除了它并更新了它

while the other same one delete the node but doesn`t update it(unless i created new tree and replaced with old one) 而另一个相同的节点删除该节点但不更新它(除非我创建了新树并替换为旧的树)

i have tried all listed solution in many placed like https://community.oracle.com/thread/2495518?tstart=0 我已经尝试了所有列出的解决方案,例如https://community.oracle.com/thread/2495518?tstart=0

but non of them work my non-working code goes as follows 但是它们都不起作用,我的不起作用的代码如下

     DefaultTreeModel model = (DefaultTreeModel)startframe.getScrolltree().getTree().getTree().getModel();
     String key = new currentfolder().getCurrentfolder()+"/"+"a3.png";
     System.out.println(key);
     model.removeNodeFromParent(startframe.getScrolltree().getTree().getTreeMap().get(key));

and my class tree goes as following 我的班级树如下

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);

when i do tree t = new tree; 当我做tree t = new tree; then place it over old tree it works 然后把它放在那棵老树上

how can I fix that and any explanation why this isn`t working? 我该如何解决该问题以及为何无法解决问题的任何解释? thanks 谢谢

When I replace all that with SwingUtilites.invokeLater() , it worked. 当我将所有内容替换为SwingUtilites.invokeLater() ,它起作用了。 I don't understand why. 我不明白为什么。

As suggested here , be sure to construct and manipulate Swing GUI objects only on the event dispatch thread‌ ​. 作为建议在这里 ,一定要建立和仅在操纵的Swing GUI对象事件调度线程 In particular, updating the TreeModel from another thread means that the listening JTree view may receive updates in some unexpected order—or not at all. 特别是,从另一个线程更新TreeModel意味着侦听的JTree视图可能以某种意外的顺序接收更新,或者根本不接收。

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

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