Swing Fenster nicht mehrmals öffnen

MikaM

Mitglied
Hallo User,

ich habe folgendes Problem. Ich möchte verhindern, das ein JFrame mehrmals nach Buttonclick geöffnet werden kann. Anbei ein Stück Programmcode. Wo liegt mein Denkfehler oder falsche Arbeitsweise? Für Eure Antworten vielen Dank!! Gruß Mika


void jButton1_mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 1)
{
FrameKond f = new FrameKond();
if (!f.isShowing()) // geht nicht
{
f.setUndecorated(true);
f.setSize(dim.width, dim.height);
f..setLocation(0, 0);
f..setVisible(true);
}
}
}
 
Hallo MikaM,
benutze doch bitte für geposteten Code die [.JAVA][./Java] Tags (ohne Punkte) um den Code leserlicher zu gestalten.

Nun zu deinem Problem. Deine Idee ist schon richtig. Das Problem ist allerdings dieser Zeile:
Java:
FrameKond f = new FrameKond();
Du erstellst bei jedem Methodenaufruf ein neues Fenster, deine nachfolgende Abfrage kann also nu "true" zurückliefern. Du könntest dein Fenster global deklarieren und beim Schließen des Fensters die "dispose()"-Methode aufrufen.

Java:
FrameKond f = new FrameKond();

void jButton1_mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 1)
{
if (!f.isShowing()) // geht nicht
{
f.setUndecorated(true);
f.setSize(dim.width, dim.height);
f..setLocation(0, 0);
f..setVisible(true);
}
}
}

Und dann bei deinem Fenster mit einem WindowListener (ist allerdings dir überlassen) einfahc die Methode "dispose()" der Klasse JFrame aufrufen um das Fenster zu "verstecken".
 
Hallo Hammet,

erstmal Vielen Dank. Das mit der Ansicht des Codes war mir bewußt, ich weiß nur nicht wo ich den Quellcode diesbezüglich hinterlege, damit er gut lesbar ist.

Zum Problem. Soweit ist mir das auch klar, das das Frame immer wieder nach Click neu angelegt wird. Das dispose() habe ich auch drinnen. Aber, ich kann es ja nicht verhindern, das der Bearbeiter das Fenster offen läßt und die selbe Schaltfläche noch einmal anklickt. Er kann also beliebig viele Fenster mit gleicher Funktionalität öffnen und gerade das will ich verhindern. Mit JDialog würde es zwar gehen, aber ich suchte nach einer Möglichkeit mit JFrame. Ich hoffe Du hast eine Idee oder das geht prinzipiell nicht. Gruß MikaM
 
Lösung von hammet:
Nun zu deinem Problem. Deine Idee ist schon richtig. Das Problem ist allerdings dieser Zeile:
Java:
FrameKond f = new FrameKond();
Du erstellst bei jedem Methodenaufruf ein neues Fenster, deine nachfolgende Abfrage kann also nu "true" zurückliefern. Du könntest dein Fenster global deklarieren und beim Schließen des Fensters die "dispose()"-Methode aufrufen.
Zusatz meinerseits:
Du erstellst immer eine neue Referenz, sodass das Ergebnis in der if-Abfrage immer das selbe ist. Anstatt einer lokalen Variable für das Fenster solltest du es mal mit einer globalen Variable versuchen oder du machst aus der Klasse FrameKond nen Singleton, dann wäre das damit auch getan.
 
Hallo Hammet,

erstmal Vielen Dank. Das mit der Ansicht des Codes war mir bewußt, ich weiß nur nicht wo ich den Quellcode diesbezüglich hinterlege, damit er gut lesbar ist.

Zum Problem. Soweit ist mir das auch klar, das das Frame immer wieder nach Click neu angelegt wird. Das dispose() habe ich auch drinnen. Aber, ich kann es ja nicht verhindern, das der Bearbeiter das Fenster offen läßt und die selbe Schaltfläche noch einmal anklickt. Er kann also beliebig viele Fenster mit gleicher Funktionalität öffnen und gerade das will ich verhindern. Mit JDialog würde es zwar gehen, aber ich suchte nach einer Möglichkeit mit JFrame. Ich hoffe Du hast eine Idee oder das geht prinzipiell nicht. Gruß MikaM

Ich glaub du solltest meinen Post nochmals lesen.
1. Habe ich geschrieben wie man den Code leserlich macht (mit den [.JAVA]-Tags).
2. Habe ich auch eine Lösung zu deinem Problem gepostet (sogar den Quellcode dazu).
3. Wie Akeshihiro aiuch sagte, könnte dir ein Singleton ebenfalls helfen:
http://www.theserverside.de/singleton-pattern-in-java/
 
Hallo,

das mit der Ansicht des Quellcodes hatte ich falsch verstanden, Hammet. Ich dachte du beziehst dich auf meine unsaubere Darstellung. Hatte ich falsch verstanden. Ist mir jetzt klar. Das mit dem Singleton werde ich auch ausprobieren. Danke euch beiden. Gruß MikaM
 
Zurück