Timer-Thread in Swing öffnet jedes Mal ein neues Fenster

mysticado

Aktives Mitglied
Hallo Leute,
ich habe mir eine Swing-GUI zusammengebaut, welche mein Netz durchscannt und alle vorhandenen Rechner und die drauf laufenden Virtuellen Maschinen als JTree anzeigt.
Ausserdem habe ich einen Timer am Laufen, welcher alle 30 Sekunden das Netz wiedermals durchscannt und eventuelle Veränderungen im Jtree abändert und diesen dann wieder neu aufbaut. Komischerweise wird meine GUI nach jedem Timer-Ablauf wieder komplett als neues Fenster geöffnet (d.h. nach dem ersten Durchlauf habe ich 2 GUI-Fenster, nach dem zweiten Durchlauf 3, usw.).
Entferne ich das zweite Scannen meines Netzes (Zeile 21) und lasse nur den Jtree neu zeichnen (obwohl so natürlich keine Veränderungen vorgenommen wurden) bleibt es bei einem Fenster welches einfach neu geladen wird. Wie kommt's bitte dazu?!
Hier mein Code:

Java:
public class WebserverUtilizer extends javax.swing.JFrame implements
        SimulationListener {
    // Variables declaration
    List<NetzStruktur> networkEntities = new ArrayList<Netzstruktur>();

public static void main(String args[]) {
// Einlesen der Struktur des Netzes
networkEntities.add("Rechner");
networkEntities.add("VMs");

new WebserverUtilizer();
}

public WebserverUtilizer(){
// new JFrame(), usw.
createJTreeFromNetworkEntities();
setVisible(true);

  ActionListener action = new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                    refreshTree(); // hier wird das Netz neu eingelesen und kann dann
                                        // im JTree upgedated werden (hier drunter!)
                 root.removeAllChildren();
                 for (int h=0; h<networkEntities.size();h++) {
                     NetworkEntity networkEntity = networkEntities.get(h);
                     DefaultMutableTreeNode entityNode = new DefaultMutableTreeNode(networkEntity);
                     model.insertNodeInto(entityNode, root, root.getChildCount()); //hier werden Rechner als Knoten in den JTree eingefügt
                     for (VirtualMachine vm : networkEntity.getVirtualMachines()) {
                         
                         if (vm.getHostIP().equals(networkEntity.getIP())) {
                             model.insertNodeInto(new DefaultMutableTreeNode(vm), entityNode, entityNode.getChildCount()); // hier werden VMs an die Rechner-Nodes im JTree eingefügt.
                         }
                     }
                 }
                 model.reload();
                 expandAll(tree); 
            }
        };
        new Timer( 5000, action).start();

}
}
 
Hmm, das ist ganz komisch, ich habe alle Befehle (ausser einem System.out) aus der refreshTree() entfernt und trotzdem öffnet es mir immer wieder ein neues Fenster. Von "new WebserverUtilizer()" kann also nicht die Rede sein.
Ich versteh das net!!! 🙁
 
aber du willst refreshTree-Methode nicht posten?

eine andere Möglichkeit ist noch
new Error("neu").printStackTrace();
im Konstruktor von WebserverUtilizer,
kommt die Fehlermeldung alle 30 sec mit dem jeweiligen neuen Fenster?

poste diesen StackTrace bzw. schaue dir genau an, wer denn da der Aufrufer des Konstruktors ist
 
was natürlich auch auf schlechtes/falsches Design hindeutet sind die folgende Codezeilen:

[java=14]public WebserverUtilizer(){
// new JFrame(), usw.[/code]
[java=1]public class WebserverUtilizer extends javax.swing.JFrame [/code]

auch wenn es auskommentiert ist...
 
[java=14]public WebserverUtilizer(){
// new JFrame(), usw.[/code]

Das war nur der Konstruktor! Nochmal genauer hinschauen 😉

Aber um zu meinem Problem zurückzukommen - ich hätte die refreshTree()-Methode auch hier reingepostet, aber komischerweise habe ich das Problem korrigieren können, indem ich statt die Methode aus dem Timer aufzurufen, einfach den ganzen Inhalt der Methode in den Timer kopiert habe. Und siehe da, nun öffnen sich keine weiteren Fenster!
Ich werde diesen Beitrag als "Erledigt" markieren, wobei ich natürlich gerne wissen würde wieso es so denn nun funktioniert, allein verständnishalber!
Also danke nochmals an alle für die tolle Hilfe und falls ihr ne Idee habt wieso es denn jetzt so funktioniert, immer her mit den Infos! 😉
Gruß!
 

Zurück
Oben