如何从Thread对象重新绘制jTree?

时间:2011-08-26 00:14:19

标签: java multithreading swing jtree

我使用jTree结构来显示用户当前使用的项目的结构。当然,用户可以打开另一个项目,然后,该软件应该显示新项目的结构。我正在使用DefaultTreeModel添加/删除节点,并更新jTree结构。由于此任务可能需要几秒钟才能实现,因此它已在新Thread中实施。这是代码:

class DrawTreeThread extends Thread {
    @Override
    public void run() {
        System.out.println("drawing the tree");
        model = (DefaultTreeModel) jTree1.getModel();
        Fichier obs,
                open,
                opens = new Fichier(Batiment.data.getAbsolutePath() + "\\Open"), 
                obss = new Fichier(Batiment.data.getAbsolutePath() + "\\Obs"), 
                rooms = new Fichier(Batiment.data.getAbsolutePath() + "\\Rooms");
        Fichier bd = new Fichier(Batiment.data.getAbsolutePath() + "\\BuildingData" + Fichier.EXT);

        int size = rooms.listFiles().length;
        int nbrEtage = bd.readInt("etage");

        DefaultMutableTreeNode[] roomz = new DefaultMutableTreeNode[size];
        DefaultMutableTreeNode bat = new DefaultMutableTreeNode(Batiment.data.getAbsoluteName());
        DefaultMutableTreeNode[] obstacles = new DefaultMutableTreeNode[size];
        DefaultMutableTreeNode[] ouvertures = new DefaultMutableTreeNode[size];
        DefaultMutableTreeNode[] etages = new DefaultMutableTreeNode[nbrEtage];
        jTree1 = new JTree(bat);

        for (int etageCounter = 0; etageCounter < nbrEtage; etageCounter++) {
            String name = "RDC";
            if (etageCounter != 0) {
                name += " + " + etageCounter;
            }
            etages[etageCounter] = new DefaultMutableTreeNode(name);
            bat.add(etages[etageCounter]);
            model.insertNodeInto(etages[etageCounter], bat, 0);
        }


        for (int i = 0; i < size; i++) {
            roomz[i] = new DefaultMutableTreeNode(rooms.listFiles()[i].getAbsoluteName());
            obs = new Fichier(obss.getAbsolutePath() + "\\" + rooms.listFiles()[i].getAbsoluteName());
            open = new Fichier(opens.getAbsolutePath() + "\\" + rooms.listFiles()[i].getAbsoluteName());
            etages[rooms.listFiles()[i].readInt("etage")].add(roomz[i]);
            obstacles[i] = new DefaultMutableTreeNode("Obstacles (" + obs.listFiles().length + ")");
            ouvertures[i] = new DefaultMutableTreeNode("Ouvertures (" + open.listFiles().length + ")");
            roomz[i].add(obstacles[i]);
            roomz[i].add(ouvertures[i]);

            DefaultMutableTreeNode[] Obs = new DefaultMutableTreeNode[obs.listFiles().length];
            for (int j = 0; j < obs.listFiles().length; j++) {
                Obs[j] = new DefaultMutableTreeNode(obs.listFiles()[j].getAbsoluteName());
                obstacles[i].add(Obs[j]);
            }

            DefaultMutableTreeNode[] Open = new DefaultMutableTreeNode[open.listFiles().length];
            for (int j = 0; j < open.listFiles().length; j++) {
                Open[j] = new DefaultMutableTreeNode(open.listFiles()[j].getAbsoluteName());
                ouvertures[i].add(Open[j]);
            }
        }

        model.nodeStructureChanged(bat);
        model.reload();

        jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        jTree1.expandRow(0);
        System.out.println("drawing the tree with success");

    }
}

new DrawTreeThread().start()按钮调用ActionListner(),但没有任何事情发生。怎么了?

1 个答案:

答案 0 :(得分:3)

jTree1 = new JTree(bat); 

这没有任何作用。您所做的就是在内存中创建一个新的JTree对象。您实际上没有将树添加到GUI。

无需创建新树。而是使用以下命令创建新的TreeModel并更新现有树:

tree.setModel(...);

另外,当你调用上面的方法时,你应该把它包装在SwingUtilities.invokeLater()中,在EDT上更新GUI。