Auf Thema antworten

Hi,

es tut mir echt Leid dich zu nerven, doch ich muss dich einfach noch diese Kleinigkeit fragen, da du einfach mehr Ahnung hast als ich und wahrscheinlich auch sofort drauf kommen wirst, worum es sich bei meinem Problem handelt.

Kurz zur Erinnerung - ich habe in meine initComponents()-Methode der GUI einen SwingWorker eingebaut, welcher alle 30 Sekunden nach Änderungen in der Tree-Struktur schaut. Soweit funktioniert auch alles - die Daten werden korrekt upgedated (auch in der VMDatabase Klasse), nur will sich mein Tree nicht refreshen in der GUI.

Ich weiss, dass:

1. dieser sich wiederholende Thread in einen SwingWorker gepackt werden muss, da Swing nicht threadsicher ist.

2. Methoden die von innerhalb des SwingWorkers auf die GUI zugreifen, in der process() oder done() Methode aufgerufen werden müssen - alles andere kommt in die doInBackground()

3. ich über das TreeModel die Knoten einfach updaten kann und java übernimmt das refreshen (normalerweise) dann automatisch.



Aber! Das tut es bei mir leider immer noch nicht, obwohl ich verschiedenste Methoden ausprobiert hatte. Zuerst hatte ich es so gemacht, wie du es mir von ein paar Beiträgen erklärt hattest (wo ich meinen Tree das erste Mal erstellen wollte, beim Aufbau der GUI), sprich ich habe einfach nur diese alte Methode kopiert und sie für den SwingWorker etwas abgeändert - hat leider nichts gebracht. Nun versuche ich es über das Modell, aber trotzdem will es nicht so wirklich. Das erste Mal klappt es normalerweise immer, aber es will sich einfach nicht alle 30 Sekunden refreshen. Kann es sein, dass meine done()-Methode nur einmal aufgerufen wird, obwohl die doInBackground()-Methode endlos läuft (siehe Code unten)?


Ausserdem bekam ich immer wieder eine NullPointerException bei jedem Refresh, doch die fange ich nun ab in der Hoffnung, dass sie den Programmablauf nicht stört. Jedoch könnte auch sie vielleicht der Grund sein, dass der Refresh nicht funktioniert? Die NPE tauchte wie gesagt jedes Mal beim Refresh des Baums auf, nachdem mein TreeSelectionListener versucht, den letzten ausgewählten Pfad zu finden - du erinnerst dich:

[code=Java]

 DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree

                        .getLastSelectedPathComponent();

                Object data = node.getUserObject();

                VirtualMachine vm = null;

                if (data instanceof NetworkEntity) {

                } else {

                    vm = (VirtualMachine) data;

                    ueberschrift.setText(" VM: " + vm.getIP());

                }

[/code]


Es könnte also mehrere Gründe haben und ich bin einfach der Hoffnung, du wirst es mit deiner reichen Erfahrung sofort rausfinden können :)

Hier noch der Code für den SwingWorker:


[code=Java]

    SwingWorker job = new SwingWorker(){


            @Override

            protected Object doInBackground() throws Exception {

                while(true){

                Thread.sleep(30000);

                refreshTree();

                return null;

                }

            }

            protected void done(){

                // treeNode1 = rootNode !

                List<NetworkEntity> networkEntities = VMDatabase.networkEntities;

                treeNode1.removeAllChildren();

                for (int h=0; h<networkEntities.size();h++) {

                    NetworkEntity networkEntity = networkEntities.get(h);

                    DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode(networkEntity);

                    model.insertNodeInto(entityNode, treeNode1, treeNode1.getChildCount());

                    for (VirtualMachine vm : networkEntity.getVirtualMachines()) {

                       

                        if (vm.getHostIP().equals(networkEntity.getIP())) {

                            model.insertNodeInto(new DefaultMutableTreeNode(vm), entityNode, entityNode.getChildCount());

                        }

                    }

                }

                // Verschiedene Refreshing-Versuche:

                //((DefaultTreeModel) model).nodeStructureChanged(treeNode1);

                //model.reload();

                //tree.treeDidChange();

                //expandAll(tree);   

               

                }

        };

        job.execute();

[/code]



Oben