2010-02-04 52 views
0

我遇到了JTree的一些問題。當我在同一個類中創建我的DefaultTreeModel時,JFrame更新正常。但是,我想從另一個類調用更新方法,並且在執行時,JTree保持空白。 JTree處於類GUI中,並在另一個名爲store的類中存儲。java JTree不更新

public static GUI UI = new GUI(); 

...

UI.init(); 
UI.buildJTree(xml); 

然而,這什麼也不做。然而,我在類圖形用戶界面我呼籲:

buildJTree(xml); 

一切工作正常。有沒有人有任何想法,爲什麼可能有問題?

構建樹的方法如下:

public void buildTree(String xml) { 
    try { 
     Console.output("Building tree"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(XML.wrap(xml.trim()))); 
     Document doc = db.parse(is); 
     NodeList xml_packet = doc.getElementsByTagName("packet"); 
     NodeList channels = xml_packet.item(0).getChildNodes().item(0).getChildNodes(); 

     Element start = (Element) xml_packet.item(0).getFirstChild(); 
     this.status_txt.setText(start.getAttribute("connected") + ", connected."); 
     MutableTreeNode root = new DefaultMutableTreeNode(start.getAttribute("server")); 

     for (int n = 0; n < channels.getLength(); n++) { 
      Element fstElmnt = (Element) channels.item(n); 
      Console.output("CHANNEL::" + fstElmnt.getAttribute("name")); 
      DefaultMutableTreeNode userss = new DefaultMutableTreeNode(fstElmnt.getAttribute("name")); 
      root.insert(userss, n); 

      NodeList users = channels.item(n).getFirstChild().getChildNodes(); 

      for (int usr = 0; usr < users.getLength(); usr++) { 
       userss.insert(new DefaultMutableTreeNode(users.item(usr).getFirstChild().getNodeValue()), usr); 
      } 
     } 


     model = new DefaultTreeModel(root); 

     this.trees.setModel(model); 

     for (int t = 0; t < this.trees.getRowCount(); t++) { 
      this.trees.expandRow(t); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

提前非常感謝。

+1

請添加更多的代碼。 '''''buildJTree()'的實現將是一個好的開始。 – akf 2010-02-04 03:56:04

+0

增加了GUI buildXML方法 – Hugh 2010-02-04 11:42:47

回答

3

您的問題中的信息太少,無法確定,但有可能您違反了必須在事件線程中完成所有Swing變異工作的要求。

因此,舉例來說:

final Runnable swingTask = new Runnable() { 
    public void run() { 
     UI.init(); 
     UI.buildJTree(xml); 
    } 
}; 
if (EventQueue.isDispatchThread()) { 
    swingTask.run(); 
} else { 
    EventQueue.invokeAndWait(swingTask); 
} 
+0

bravo。你是對的。我沒有看到Netbeans已經將它包裝在自己的Runnable中。輝煌。謝謝 – Hugh 2010-02-04 11:48:06