1Danke
ERLEDIGT
JA
JA
ANTWORTEN
13
13
ZUGRIFFE
464
464
EMPFEHLEN
-
Hallo Leute,
ich sitze grad an meiner GUI welche mir die Rechner und die drauf laufenden Virtuellen Maschinen anzeigt. Soweit klappt das alles auch sehr gut, nur habe ich folgendes Problem:
Es soll ein Thread geschrieben werden, welcher eventuelle Änderungen des Baums bemerkt (sprich, wenn eine VM auf einen anderen Rechner umzieht) und den Baum dementsprechend updaten. Das will jedoch leider nicht wirklich so wie ich es möchte. Daher die Bitte - könnt ihr mir sagen, wie das am besten gehandhabt werden kann?
Ich habe schon versucht den Baum komplett neu zu erstellen, und dann in der GUI neu zu zeichnen, aber keine der Methoden wollte so wirklich und auch wenn ja, dann sind die Nodes alle collapsed...
-
08.11.11 11:27 #2
Hi,
ohne Code können wir dir bei deinem Problem nur sehr schwer weiter helfen.
Gruß
FabioBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Also, ich versuche es folgendermaßen:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Baum neu zeichnen javax.swing.tree.DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); root.removeAllChildren(); for (NetworkEntity networkEntity : VMDatabase.networkEntities) { DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode( networkEntity); for (VirtualMachine vm : networkEntity.getVirtualMachines()) { if (vm.getHostIP().equals(networkEntity.getIP())) { entityNode.add(new DefaultMutableTreeNode(vm)); } } root.add(entityNode); } // ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(root); // ((DefaultTreeModel) tree.getModel()).reload(); // tree.expandRow(0); // expandAll(tree);
Was ich mache ist im Prinzip, dass ich mir den alten schon bestehenden Baum (der bei der Initiierung der GUI gemalt wurde) erstmal leere, sprich ich entferne alle Knoten ausser dem Root.
Danach lese ich die neuen Werte ein, wobei "networkEntity"(der Rechner) der Wert für die Knoten ist, und "virtualMachine" die Leafs der jeweiligen NetworkEntity sind.
Ist ja eigentlich einleuchtend - jeder Rechner enthält ein paar auf ihm laufende VM's.
Ganz unten könnt ihr jedoch anhand der auskommentierten Lines sehen welche Methoden ich schon probiert habe, um den abgeänderten Baum neu zu zeichnen. Leider hat keines davon geklappt
Komischerweise scheint es so, als ob nach dem ersten Update (zB. eine VM migriert von einem Rechner auf den anderen, d.h. in einer neue networkEntity) der Baum einfriert. Wenn ich dann auf einen der oberen zwei Eintrage klicke, werden die zwei bestehenden networkEntities collapsed neu angezeit. Wenn ich diese aufmache, kann ich dann die dazugehörigen VMs auch korrekt zugewiesen sehen. Das Ding ist, das klappt nur einmal! Bei der nächsten Migration passiert das nicht mehr und der Baum bleibt dann die ganze Zeit so wie er ist.
Ausserdem nervt es mich unheimlich, dass der Baum collapsed ist. Er MUSS komplett angezeigt werden******
Was kann ich hier machen?
Ein Bekannter meinte was von TreeModel und dass ich auf Veränderungen im Baum reagiere, denn dann würde ich das reload() usw. gar nicht brauchen. Jedoch weiss ich leider nicht wie das geht
-
08.11.11 14:02 #4
1. Anzeigen aller Einträge
Also ich fang mal mit dem Problem an, alle Einträge anzeigen zu lassen. Dazu habe ich hier einen Link gefunden, auf dem ein Code-Beispiel steht, welches dir sicherlich weiterhelfen wird.
2. Reload bzw. update JTree
Da hilft dir vielleicht die Methode weiter. Allerdings würde ich diese Methode aufrufen, bevor du alle Nodes anzeigen lässt über 1. .
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Okay, ich habe es nun so versucht:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
javax.swing.tree.DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); root.removeAllChildren(); tree.treeHasChanged(); for (NetworkEntity networkEntity : VMDatabase.networkEntities) { DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode( networkEntity); for (VirtualMachine vm : networkEntity.getVirtualMachines()) { if (vm.getHostIP().equals(networkEntity.getIP())) { entityNode.add(new DefaultMutableTreeNode(vm)); } } root.add(entityNode); } ...private void expandAll(JTree tree, boolean b){...}
doch leider wieder das selbe Ergebnis. Der Tree wird einfach nicht upgedated. Ich versteh das nicht! Dabei sind die internen Daten garantiert korrekt (habe es überprüft). Alleine das Zeichnen des Trees will nicht so wie ich es möchte.
Könnte es daran liegen, dass ich die Methode in der die Tree-Veränderung liegt, bei mir innerhalb deraufgerufen wird?Code c:1
initComponents()
Oder könnte es evtl. da dran liegen, dass diese Methode dann noch in einen SwingWorker gepackt ist (wg. Threading-safety)?
-
08.11.11 16:01 #6
Dass das nicht gehen kann, ist klar. Wenn du dem JTree sagst, es hat sich etwas verändert, nachdem du alle Elemente gelöscht hast und noch keine hinzugefügt hast, kann er da nicht all zu viel machen, außer die Elemente von der GUI löschen. Das wird aber im Normalfall automatisch mit 'tree.removeAllChildren()' gemacht.
Ich habe das so gemeint:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public void deineMethode() { // ... javax.swing.tree.DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); root.removeAllChildren(); for (NetworkEntity networkEntity : VMDatabase.networkEntities) { DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode( networkEntity); for (VirtualMachine vm : networkEntity.getVirtualMachines()) { if (vm.getHostIP().equals(networkEntity.getIP())) { entityNode.add(new DefaultMutableTreeNode(vm)); } } root.add(entityNode); } tree.treeDidChanged(); expandAll(tree, true); } private void expandAll(JTree tree, boolean b) {...}
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Okay, ich habe nun rausbekommen weswegen erstmal mein Tree überhaupt nicht korrekt gezeichnet wird - wieso es sich aber so verhält, weiss ich nicht. Vielleicht kann mir hier jemand helfen?
Meine Klasse sieht wie folgt aus:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
public class MeineKlasse{ public MeineKlasse(){ initComponents(); } public static void main(String[] args){ MeineKlasse mk = new MeineKlasse(); mk.setVisible(true); } public void initComponents(){ // alle Komponenten werden geladen SwingWorker job = new SwingWorker(){ @Override protected Object doInBackground() throws Exception { while(true){ Thread.sleep(30000); refreshTree(); return null; } } }; job.execute(); pack(); } public void refreshTree(){ // ... javax.swing.tree.DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); root.removeAllChildren(); for (NetworkEntity networkEntity : VMDatabase.networkEntities) { DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode( networkEntity); for (VirtualMachine vm : networkEntity.getVirtualMachines()) { if (vm.getHostIP().equals(networkEntity.getIP())) { entityNode.add(new DefaultMutableTreeNode(vm)); } } root.add(entityNode); } tree.treeDidChange(); expandAll(tree, true); } } }
Komischerweise bricht meine For-Schleife in Zeile 34 schon nach dem ersten Durchlauf ab, obwohl ich 2 networkEntities besitze. Auch sind die Werte alle korrekt eingetragen worden in die Listen, sprich es kann nicht an Dateninkonsistenzen liegen, und trotzdem läuft die Schleife nicht zwei Mal durch. Komischerweise wird auch nichts mehr unterhalb der Zeile 41 ausgeführt?! Woran könnte das liegen?
-
08.11.11 18:55 #8
Das wird schwer, wenn du uns nicht verrätst, wie du das Problem nun gelöst hast.
Ich würde vermuten, dass in Zeile 42 eine Exception geschmissen wird, die von dir "ignoriert" wird und deshalb die Methode verlassen wird.
Wie verhält sich das Programm denn ab Zeile 41? Wird die Methode verlassen und das Programm läuft dann normal weiter oder bleibt das Programm da hängen?Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Die Satz war falsch formuliert - es ging eigentlich um den Code, der drunter stand. Also einfach ignorieren

Den Fehler mit der Zeile 42 hab ich nun auch rausbekommen - mensch, manchmal vergisst man die simpelsten Dinge (wie z.B. eine abgefangene Exception), also danke für die Erinnerung! Im Großen und Ganzen ging es um eine ArrayIndexOutOfBoundsException in meiner System.out.println, die ich dann prompt entfernt habe und nun sind alle Werte auch korrekt.
Leider habe ich aber immer noch das Problem mit dem Erneuern des Trees! Wie gesagt, die Methode die den alten Tree löscht und neu aufbaut ist in einem SwingWorker, der alle 30Sek. wiederholt wird. Vielleicht zickt der SwingWorker ja irgendwie rum?
Mein neuer Ansatz ging darauf hinaus, dass die refreshTree-Methode in der doInBackground() Methode des SwingWorkers aufgerufen wird, und das eigentliche erneuern des Trees dann erst in der done()-Methode geschieht (hab online irgendwas davon gelesen, dass Threads die auf die GUI zugreifen erst in der process() oder done()-Methode aufgerufen werden sollen). Das heisst, mein Code sieht nun so aus:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
public void initComponents(){ //... SwingWorker job = new SwingWorker(){ protected Object doInBackground() throws Exception { while(true){ Thread.sleep(30000); refreshTree(); return null; } } protected void done(){ tree.treeDidChange(); expandAll(tree); } }; job.execute(); } public void refreshTree(){ // ... List<NetworkEntity> networkEntities = VMDatabase.networkEntities; javax.swing.tree.DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); root.removeAllChildren(); for (int h=0; h<networkEntities.size();h++) { NetworkEntity networkEntity = networkEntities.get(h); DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode(networkEntity); for (VirtualMachine vm : networkEntity.getVirtualMachines()) { if (vm.getHostIP().equals(networkEntity.getIP())) { entityNode.add(new DefaultMutableTreeNode(vm)); } } root.add(entityNode); } }
Wieso mag es jetzt net? :-/
-
09.11.11 08:13 #10
Mh... also ich hab gerade mal selber eine Testklasse geschrieben. Da funktioniert es. Hier mal mein Code:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
package de.tutorials; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; public class JTreeChangeUp extends JFrame { private final DefaultMutableTreeNode rootNode; private final DefaultTreeModel model; private final JTree tree; /** * */ public JTreeChangeUp() { super("JTreeChangeUp - Test"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(300, 300); rootNode = new DefaultMutableTreeNode("Root"); model = new DefaultTreeModel(rootNode); tree = new JTree(model); add(tree); new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { rootNode.removeAllChildren(); for(int i = 0; i < 10; i++) { DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode( String.valueOf(Math.random()*1000+1) // durch deine Werte ersetzen ); for(int j = 0; j < 10; j++) { entityNode.add(new DefaultMutableTreeNode( String.valueOf(Math.random()*1000+1) // durch deine Werte ersetzen )); } rootNode.add(entityNode); } model.nodeStructureChanged(rootNode); // hier noch die expandAll-Methode aufrufen } }, 3000, 3000); setVisible(true); } /** * @param args */ public static void main(String[] args) { new JTreeChangeUp(); } }
Den einzigsten Unterschied den ich feststellen kann ist, dass ich mit einem Timer arbeite und du mit dem SwingWorker. Vielleicht probierst du es auch mal mit dem Timer.Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Nein, der Timer hat mir leider auch nicht helfen können. Also ich habe meine refreshTree()-Methode überprüft und die Daten werden auf jeden Fall korrekt eingelesen. Das einzige Problem, das ich nun habe ist, dass der Tree in der GUI nicht upgedated wird.
Ich vermute, dass es höchstens was mit der Art wie ich den Tree update zu tun hat, sprich, dass ich es im SwingWorker mache und deswegen die Werte irgendwie nicht angezeigt werden können. Jedenfalls passiert rein gar nichts, wenn den Update so wie oben durchführe...
Any ideas?
-
10.11.11 08:04 #12
Das ist aber wirklich merkwürdig, wenn der Timer bei dir zum updaten nicht funktioniert. Da es bei mir doch auch funktioniert hat. Auch mit dem update der GUI vom Tree...
Hast du mal überprüft, ob das Programm überhaupt in deine done()-Methode reingeht?
Außerdem ist mir noch eine Kleinigkeit in deinem Code aufgefallen. Warum hast du in der doInBackground()-Methode eine while-Schleife, wenn du darin noch ein 'return null' aufrufst und damit die Schleife wieder verlässt?
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14
protected Object doInBackground() throws Exception { // while(true){ --> Unnötig?! Thread.sleep(30000); // 30sec refreshTree(); return null; // } } protected void done(){ // Wird diese Ausgabe gemacht? System.out.println("Update Tree..."); tree.treeDidChange(); expandAll(tree); }
Hast du eigentlich schon mal die Methode tree.repaint() ausprobiert?
Geändert von Fabio Hellmann (10.11.11 um 09:58 Uhr) Grund: tree.repaint() hinzugefügt
Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
-
Hi Fabio,
ich wollte mich nur noch einmal bei dir für die tolle Hilfe bedanken! Ich habe es nun noch einmal mit dem Timer versucht (eigentlich hätte ich von vornherein den Timer nutzen sollen, da der Swingworker nicht kontinuierlich ausgeführt werden kann - daher meine while-Schleife) und siehe da - nun funktioniert es
Endlich updated sich der JTree korrekt und auch die Daten passen!
Daher noch einmal DANKE******
-
10.11.11 10:31 #14
Keine Ursache

ps.: Kannst du das Thema dann noch als erledigt markieren, wenn dein Problem gelöst ist? DankeBitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]
Tutorials:
Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
JAnimationPanel - Animationen für Swing/AWT
SWTRatingBar (Bewertungs-Composite) selbst programmieren
____________________________________________________________________________
Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.
Ähnliche Themen
-
JTree
Von Hippopotamus im Forum JavaAntworten: 3Letzter Beitrag: 22.01.08, 13:11 -
JTree breitet große Probleme, kann uns bitte jemand helfen!!
Von chaosteam im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 04.01.07, 16:33 -
JTree Scrollbar-Probleme
Von Marshallbbw im Forum JavaAntworten: 2Letzter Beitrag: 17.04.06, 11:08 -
Probleme mit JTree
Von Loki2 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 17.03.06, 17:51 -
Probleme mit dem JTree
Von jorgeHX im Forum JavaAntworten: 2Letzter Beitrag: 21.07.05, 15:24





Zitieren
Login





