Fenster verwalten

Deathman123456

Grünschnabel
Hallo in die Runde

habe folgendes Problem:
Ich möcht mehrere JFrame Fenster in einer Liste verwalten z.B. LinkedList,
leider speichert er immer nur ein Fenster in die Liste, egal wie viele ich öffne:rolleyes:.

vielen Dank für Eure Hilfestellungen vorab, anbei mein Code:

Java:
public class FensterHandler extends WindowAdapter {

    LinkedList<Window> fensterListe = new LinkedList<Window>();
    private Iterator<Window> iterator;

    public void windowClosing(WindowEvent we) {
	Window w = we.getWindow();
// entfernt das Fenster aus der Liste
	fensterListe.remove(w);
	System.out.println("Noch vorhandene Objekte in der Liste: " + fensterListe.size());
    }

    public void windowOpened(WindowEvent we) {
	Window w = we.getWindow();	
// fügt ein Fenster in die Liste ein
	fensterListe.add(w);
    }

    public void alleFensterSchliessen() {
	iterator = fensterListe.iterator();
	while (iterator.hasNext()) {
	    Window w = (Window) iterator.next();
	    fensterListe.remove(w);
	    w.dispose();
	}
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Sers!

Ich geh jetzt einfach mal davon aus dass du deinen "FensterHandler " dann mit der Methode addMouseListener(MouseListener) bei jedem JFrame registrierst?!

Davon ausgegangen macht der Code nur das was du ihm sast. Er initialisiert bei JEDER Registrierung einen neue LinkedList. Sprich... hat jeder JFrame seine eigene Liste!!

Vorschlag nr1: Wäre ein Singelton-Pattern, dass verhindert, dass es mehr als ein Objekt von deinem Handler geben kann.

Vorschlag nr2: Die Handler-Klasse zu einer normalen Listener/Adapter-Klasse "degradieren" und die Liste in die HauptKlasse verlegen in der deine JFrames erzeugt werden!

Ich hoffe das hilft!
 
Zuletzt bearbeitet:
Hi macsx,

danke für deine Antwort,

HTML:
Vorschlag nr1:
 Wäre ein Singelton-Pattern, dass verhindert, dass es mehr als ein Objekt von deinem Handler geben kann.
:confused:

Ich habe leider keine Ahnung wie ich so etwas anwende!

Wäre nett wenn Du mir einen Tipp geben könntest, Dank
 
Hi hammet,

der eigentliche Code ist etwas lang, darum in Kurzform:

Java:
public class Testklasse extends JFrame {
    
    public Testklasse(){
	for( int i = 0; i < 5; i++){
	    JFrame f = new JFrame("H " + i);
	    f.setSize(70, 40);
	    f.setVisible(true);
	    f.addWindowListener(new TestFenster());
	}
    }
    
    public static void main(String[] args) {
	new Testklasse();
    }
}

und der Handler:

Java:
public class TestFenster extends WindowAdapter {
    
    private LinkedList list = new LinkedList();
    
    public void windowOpened(WindowEvent e) {
	Window w = e.getWindow();
	list.add(w);
	System.out.println(list.size());
    }
    public void windowClosing(WindowEvent e) {
	Window w = e.getWindow();
	list.remove(w);
	System.out.println(list.size());
    }
}

nach dem ausführen gibt es nur ein Objekt in der Liste:confused:
Danke für Eure Hilfe.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ist ja auch ganz klar.

Du legst ja auch immer wieder ein neues Listener-Object an.
Code:
f.addWindowListener(new TestFenster());
Dadurch hat auch jeder Listener eine eigene neue Liste.

Du solltest es so machen.
Code:
WindowListener listener = new TestFenster();
for( int i = 0; i < 5; i++){
        JFrame f = new JFrame("H " + i);
        f.setSize(70, 40);
        f.setVisible(true);
        f.addWindowListener(listnener);
    }

Gruß

Sascha
 
Hallo Sascha,

vielen Dank, so klappt es auch!

habe jedoch einen Fehler gemacht beim Code in Kurzform:
deshalb hier nochmal die Korrektur:

Es wird jedesmal wenn ich auf Fenter klicke FensterOeffnen aufgerufen,
hier erkennt er es jetzt nicht mehr.

Ich öffne aus einem Verzeichnis heraus verschiedene Bilder, es wird also für jedes Bild ein neues Fenster geöffnet.

Wie Du es schon gesagt hattest, er öffnet jedesmal eine neue Liste.
Würde mich freuen wenn Du mir hier noch mal helfen könntest, Danke

Java:
public class Testklasse extends JFrame implements ActionListener {
   
    JButton but;
   
    public Testklasse(){
    setTitle("TestKlasse");
    setSize(150, 100);
    but = new JButton("Neues Fenster");
    but.addActionListener(this);
    this.getContentPane().add(but);
    setVisible(true);
    }
   
    public static void main(String[] args) {
    new Testklasse();
    }

    public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(but))
        new FensterOeffnen();
    }
}

Java:
public class FensterOeffnen extends JFrame {
   
    WindowListener listner = new TestFenster();
   
    public FensterOeffnen(){
     setTitle("Fenster");
        setSize(70, 40);
        setVisible(true);
        this.addWindowListener(listner);
    }
}

Java:
public class TestFenster extends WindowAdapter {
   
    private LinkedList list = new LinkedList();
   
    public void windowOpened(WindowEvent e) {
    Window w = e.getWindow();
    list.add(w);
    System.out.println(list.size());
    }
    public void windowClosing(WindowEvent e) {
    Window w = e.getWindow();
    list.remove(w);
    System.out.println(list.size());
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Hier könntest du den Vorschlag von macsx nehmen.

Du machst den Listener zu einem Singleton. Das heißt es kann nur eine Instance von deinem Listener geben.

Code:
public class TestFenster extends WindowAdapter {

   private static TestFenster instance = null;   

    private LinkedList list = new LinkedList();

   private TestFenster(){};   

    public void windowOpened(WindowEvent e) {
    Window w = e.getWindow();
    list.add(w);
    System.out.println(list.size());
    }
    public void windowClosing(WindowEvent e) {
    Window w = e.getWindow();
    list.remove(w);
    System.out.println(list.size());
    }
}

public static TestFenster getInstance(){

   if(instance == null)
       instance = new TestFenster();
    return instance;

}

Code:
public class FensterOeffnen extends JFrame {
   
    public FensterOeffnen(){
     setTitle("Fenster");
        setSize(70, 40);
        setVisible(true);
        this.addWindowListener(TestFenster.getInstance());
    }
}


Gruß

Sascha
 
Sers!

Wenn du jetzt noch die getInstance()-Methode synchronisierst... schon ist das Singelton perfekt!

Code:
public synchronized static TestFenster getInstance(){

   if(instance == null)
       instance = new TestFenster();
    return instance;

}

Sonst könnten bei gleichzeitigem Zugriff tatsächlich mehrere Objekte gebildet werden, wenn der erste Aufruf dieser Methode noch nicht ganz fertig mit der Objektbildung ist aber der zweite Aufruf schon erfolgt!
 

Neue Beiträge

Zurück