2009-04-16 4 views
0

Ich erstelle ein JTree und modelliere es in einer Klasse, die von der GUI-Klasse getrennt ist. Die Daten für den JTree werden aus einer Datei extrahiert.JTree während der Laufzeit neu laden

Jetzt in der GUI-Klasse kann der Benutzer Dateien aus dem Dateisystem zu einer AWT-Liste hinzufügen. Nachdem der Benutzer auf eine Datei in der Liste geklickt hat, möchte ich, dass JTree aktualisiert wird. Der Variablenname für den JTree ist schemaTree.

Ich habe den folgenden Code für das, wenn ein Element in der Liste ausgewählt ist:

private void schemaListItemStateChanged(java.awt.event.ItemEvent evt) { 
     int selection = schemaList.getSelectedIndex(); 
     File selectedFile = schemas.get(selection); 
     long fileSize = selectedFile.length(); 
     fileInfoLabel.setText("Size: " + fileSize + " bytes"); 

     schemaParser = new XSDParser(selectedFile.getAbsolutePath()); 

     TreeModel model = schemaParser.generateTreeModel(); 
     schemaTree.setModel(model); 
} 

ich den Code aktualisiert haben, um die akzeptierte Antwort zu entsprechen. Der JTree wird jetzt korrekt aktualisiert, basierend auf der Datei, die ich in der Liste auswähle.

+0

hilft ich eine Folge auf Frage hier gepostet haben: http://bit.ly/ iaDqS –

Antwort

1

ich nicht sicher, dass ich Ihre Frage bin zu verstehen, aber ich werde versuchen ...

Das Richtige sollte zu tun, IMHO:

  • die Datei
  • bekommen erstellen eine neue TreeModel aus Ihrer Datei
  • das Modell

In Pseudo-Code zu dem JTree geben, es so aussehen würde:

File newContent = getSelectedByUser(...); 
TreeModel newModel = new MyFileBasedTreeModel(newContent); 
//this next part must be done in the EventDispatcherThread 
myTree.setModel(newModel); 

dann die JTree aktualisiert, ohne Anruf würde neu zu zeichnen usw.

Hoffe, dass es

+1

Sehr gut, ich habe jetzt die Methode generateTree() geändert, um das Modell anstelle der Struktur und benannte die Methode generateTreeModel(). Der Baum wird nun korrekt aktualisiert, basierend darauf, auf welche Datei ich in der Liste klicke. Vielen Dank! –

2

Aus der Component.add API-Dokumentation.

Hinweis: Wenn eine Komponente einen Behälter wurde hinzugefügt, die angezeigt wurde, validate auf diesem Container genannt werden, müssen die neue Komponente angezeigt werden soll. Wenn mehrere Komponenten hinzugefügt werden, können Sie Effizienz verbessern, indem Sie nur einmal validieren, nachdem alle Komponenten hinzugefügt worden sind.

Sie haben repaint und validate auf einer Komponente aufgerufen, die nicht angezeigt wird, die nicht wirksam sein wird. Sie müssen diese Methoden auf dem mainPanel nach dem add aufrufen. Auch revalidate neigt dazu, besser zu sein als validate, da es effektiv koalesziert.

+0

Ich habe versucht, auf dem MainPanel revalidate, aber der JTree noch nicht aktualisiert. Ich werde den Code in der ursprünglichen Frage zu dem ändern, was ich jetzt habe –

+0

Es sieht so aus, als ob Sie die neue Struktur nicht zum Panel hinzugefügt haben. –

+0

Funktioniert jetzt .. Ich entferne den JTree jetzt überhaupt nicht, ich habe gerade das Modell nicht an der richtigen Stelle aktualisiert. Vielen Dank für Ihre Antwort –