2010-02-04 8 views
0

JTree에 몇 가지 문제가 있습니다. 같은 클래스 내에서 DefaultTreeModel을 만들면 JFrame이 잘 업데이트됩니다. 그러나 다른 클래스에서 update 메소드를 호출하고 싶을 때 JTree를 수행 할 때 비어있게됩니다. JTree는 클래스 GUI에 있으며 store라는 다른 클래스에 저장됩니다.java JTree가 업데이트되지 않습니다.

public static GUI UI = new GUI(); 

...

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

그러나, 이것은 아무것도하지 않습니다. 그러나 클래스 GUI 안에 내가 전화 :

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

는 더 많은 코드를 추가하십시오. 'GUI'의'buildJTree()'구현은 좋은 시작이 될 것입니다. – akf

+0

GUI buildXML 메서드 – Hugh

답변

3

질문에 정보가 너무 적지 만 모든 스윙 변경 작업을 이벤트 스레드에서 수행해야한다는 요구 사항에 위배 될 가능성이 있습니다.

따라서, 예를 들어 :

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

관련 문제