Feststellen ob Fenster schon geöffnet ist

OnkelHomie

Grünschnabel
Hab hier ein Programm mit einem Hauptfenster von dem aus weitere Fenster über Buttons geöffnet werden können. Jetzt würde ich gerne, bevor ein solches Fenster geöffnet wird, abfragen ob es womöglich schon offen ist, um ein doppeltes Öffnen zu vermeiden.

Zunächst hatte ich einfach eine boolean Variable dazu genutzt, allerdings geht dies durch eine neue Programmstrukur nicht mehr.

Gibt es also eine Möglichkeit a la:
Code:
if (window("Fenster").open)
{
  System.out.println("schon offen");
}
else
{
  Fenster = new Fenster(this);
}

Bin für jede Hilfe dankbar.

Gruß
OnkelHomie

edit:
Habs auch schon als Thread probiert. Nur seltsamerweise führt eine Abfrage wie:
Code:
if (Fenster.thread == null)
{
   Fenster = new Fenster(this);
}
else
{
   System.out.println("schon offen");
}

Wobei das Fenster selber nur wenn es geschlossen wird den Thread per stop() Method auf null setzt:
Code:
public synchronized void stop()
	{
		if (thread != null)
		{
			thread = null;
			fenster.dispose();
		}
	}

Ich bekomme aber nun immer die Ausgabe das "schon offen", auch wenn das fenster nocht nicht läuft.
Daher eben auch meine Frage, ob es eine Methode gibt die feststellt ob das Fenster schon offen ist.
 
Zuletzt bearbeitet:
Heyho...

wie wäre es mit
Java:
// entweder true oder false
if(!fenster.isShowing()) {
    fenster = new fenster();
}

Hast du dir sowas vorgestellt!?

Gruß
Felix
 
Zum zweiten...

Um zu testen, ob ein Thread gerade läuft benutzt du besser
Java:
mythread.isAlive();

Gruß
Felix
 
Heyho...

wie wäre es mit
Java:
// entweder true oder false
if(!fenster.isShowing()) {
    fenster = new fenster();
}

Hast du dir sowas vorgestellt!?

Gruß
Felix

ja so etwas in der Art habe ich mir vorgestellt. Werde es gleich mal testen, danke.

Zum zweiten...

Um zu testen, ob ein Thread gerade läuft benutzt du besser
Java:
mythread.isAlive();

Gruß
Felix

Führt zum selben Ergebnis. Das mit "thread = null" habe ich aus ein Artikel über sinnvolle Threadsteuerung.
Aber werde ich womöglich auch nochmal damit testen bzw. verbessern.
Danke.

edit:
zu 1:
habs getestet und es funktioniert leider nicht mit folgendem Code:
Code:
if(e.getSource() == jButton_Dictionary)
		{
			dictionary = new Dictionary(this); 
                        //Alle Buttons farblich zurücksetzen
			clear_GUI();
			
			if (!dictionary.isShowing())
			{
				//dictionary.setDictionary_running(true);
				
				dictionary.setTitle("Wörterbuch");

				dictionary.requestFocus();
				dictionary.setVisible(true);
			    	    
				jButton_Dictionary.setForeground(new java.awt.Color(255,0,0));
			}
			else
			{
				System.out.println("schon offen");
			}
		}

Damit kann ich auch beliebig oft dieses Fenster öffnen. Denn auch wenn das Fenster offen ist, wird stehts "false" zurückgegeben.

edit2:
Auch der Vorschlag es wieder als Thread laufen zu lassen und dann auf "isAlive()" zu prüfen führt leider nicht zum gewünschten Ergebnis.

Insgesamt muss es an der Reihenfolge liegen wie das fenster geöffnet wird bzw. dessen Status gesetzt wird. Aber da sehe ich eben gerade den Wald vor lauter Bäumen nicht.
 
Zuletzt bearbeitet:
Dann überschreib doch die Methode setVisible und merk dir darin selber ob das Fenster geöffnet ist oder nicht. Nur nicht vergessen super.setVisible aufzurufen.
 
Habs mal getestet, zumindest meine ich das ich es so gemacht habe, wie du es vorgeschlagen hast. Aber nach 10 Stunden vor dem Code sitzen, sieht man ja schon mal den kleinsten, dümmsten Fehler nicht mehr.

Also das Problem vom Code her dürfte folgendens sein:
Code:
		if(e.getSource() == jButton_Dictionary)
		{
			dictionary = new Dictionary(this);

			//Button-Farbe zurücksetzen
			clear_GUI();

			if (!dictionary.isVisible())
			{
				dictionary.setDictionary_running(true);
				
				dictionary.setTitle("Wörterbuch");

				dictionary.requestFocus();
				dictionary.setVisible(true);
			    	    
				jButton_Dictionary.setForeground(new java.awt.Color(255,0,0));
			}
			else
			{
				System.out.println("läuft schon");
			}
		}

Dann ein Auszug aus der Dictionary:
Code:
public Dictionary(ProgramMain main)
	{
		super();
		this.localProgramMain = main;

		initGUI();

		addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
               
                localProgramMain.getSpeakword().stop_player();
            }
        });
	}

Am Anfang, bevor ich zur Abfrage komme ob das Fenster offen ist oder nicht, wurden ja durch den Konstruktor bereits suoer() und initGUI() aufgerufen. Nur wenn ich es nicht so gestalte, bekomme ich beim ersten Aufruf eine NullPointerException, da das Fenster noch nicht initialisiert wurde.

Mag wie gesagt dran liegen das ich nu seit Stunden nur davorsitze und durch den eigen Code-Dschungel nicht mehr durchblicke ;D aber es ist eben ein ganz blöde Fehler der verhindert das sich das Fenster nur 1 mal öffnet.
 
Ich meinte mit überschreiben:

Java:
class Dictionary extends JFrame {

private boolean open= false;

public void setVisible(boolean visible){
super.setVisible(visible);
this.open= visible;
}

public void alreadyOpened(){
return open;
}

}

Auch wenn das immer noch nach komischer Architektur klingt. Denn eigentlich sollte dir vom Programmablauf her sonst irgendwie bekannt sein ob das Fenster offen ist oder nicht.
 
So hatte ich es auch getestet.
Funktioniert leider nicht. Es wird immer false zurückgeliefert und ich verstehe beim besten Willen nicht warum. So langsam packt mich da die Verzweiflung im Debugger :mad:

Hab mir extra mal eine lokale Variable angelegt um im Debugger überprüfen zu können was da passiert. Und diese wird definitiv auf true gesetzt.
 
Ok, also mit static gehts.

Besten Dank schon mal.

Zwar wollte ich static vermeiden aber erst mal geht es wohl nicht anders. Bis mein Kopf wieder klar ist und ich den wirklichen Knackpunkt sehe. Denn wie du ja schon gesagt hast: an sich sollte man es auch anders abfragen können.
 
Zuletzt bearbeitet:
Zurück