我正在使用jTree
結構來顯示用戶當前正在使用的項目的結構。用戶當然可以打開另一個項目,然後該軟件應該顯示新項目的結構。我正在使用DefaultTreeModel
添加/刪除節點,並更新jTree
結構。由於這項任務可能需要幾秒鐘才能完成,因此在新的Thread
中實施。下面的代碼:如何從Thread對象重繪一個jTree?
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()
叫,但什麼也沒有發生。什麼是錯的?
這可能會有助於提及在'run()'的開頭和結尾的兩個'System.out.println()'行顯示正確。 –