2010-02-04 6 views
0

J'ai quelques problèmes avec JTree. Lorsque je crée mon DefaultTreeModel dans la même classe, le JFrame a été mis à jour correctement. Cependant, je veux appeler la méthode de mise à jour d'une autre classe et quand je fais le JTree reste vide. Le JTree est dans la classe GUI et stocké comme tel dans une autre classe appelée store.java JTree ne pas mettre à jour

public static GUI UI = new GUI(); 

...

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

Cependant, cela ne fait rien. J'ai cependant dans l'interface graphique de la classe que j'appelle:

buildJTree(xml); 

Tout fonctionne bien. Quelqu'un a-t-il des idées sur la raison pour laquelle il pourrait y avoir un problème?

méthode de l'arbre de construction est la suivante:

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

} 

Merci beaucoup à l'avance.

+1

S'il vous plaît ajouter plus de code. L'implémentation de 'buildJTree()' 'GUI' serait un bon début. – akf

+0

Ajout de la GUI buildXML méthode – Hugh

Répondre

3

Il y a trop peu d'informations dans votre question pour être sûr, mais il est possible que vous ne soyez pas satisfait de l'exigence selon laquelle tout travail de mutation Swing doit être effectué dans le thread d'événement.

Ainsi, par exemple:

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

bravo. Tu avais raison. Je n'ai pas vu que Netbeans avait enveloppé la classe dans son propre Runnable. Brillant. Merci – Hugh

Questions connexes