# Wie schließen Fenster automatisch?



## Gast (2. Jan 2007)

Hallo,

ich habe folgendes Problem:

Der User will die ok-Buttens beim JOptionPane nicht drücken, das Message Fenster soll sich nach 1-2 Sekunden von alleine wieder schliessen.

Geht das mit einem JOptionPane? Wenn nein wie muss ich es machen?


DANKE!!!


----------



## AlArenal (2. Jan 2007)

LOL

Ich würde lieber ne Hand ans Fenster programmieren, die dem User mal ordentlich eine langt...


----------



## Gast (2. Jan 2007)

*seufz*

DIESE Diskussion hatte ich schon, und nachdem ich nun eine Stunde keine Lösung gefunden habe, versuche ich es (zum ersten mal) hier. Melde mich gleich an, hoffe trotzdem schon jetzt auf Hilfe.


----------



## dieta (2. Jan 2007)

```
System.exit(0);
```


----------



## AlArenal (2. Jan 2007)

@dieta:
Du bist ja fies! 


Aber mal im Ernst:
Du könntest es über nen Timer probieren.


----------



## Toast78 (2. Jan 2007)

Mal so ins Blaue geschossen:
Die Klasse Object stellt doch eine wait-Funktion bereit, der man auch einen Timeout in Millisekunden übergeben kann. Wäre da nicht drüber was machbar?


----------



## dieta (2. Jan 2007)

Nach ein bisschen API-Kramen:

```
JOptionPane.showConfirmDialog(meinFenster, "bla");
Thread tr1 = new Thread()
{
    public void run()
    {
        try
        {
            Thread.sleep(2000); //<-- Wartezeit in Millisekunden
            (meinFenster.getOwnedWindows())[0].dispose();
        } catch(InterruptedException ex) { }
    }
};
tr1.start();
```
Sollte Funktionieren.
Statt showConfirmDialog kann da auch alles andere stehen, wchtig ist nur, dass du eine instanz des Fensters, das als ParentComponent angegeben ist, hast.
Eine weitere Vorraussetzung ist, dass du mit dieserparentComponent nur diesen einen Dialog geöffnet hast.

[edit]Noch den nötigen try-catch-Block um das Thread.sleep(...) eingefügt[/edit]


----------



## Gast (4. Jan 2007)

Hallo dieta!

Vielen lieben Dank für Deine Mühe,

leider stolpere ich noch herum, und zwar über 

(meinFenster.getOwnedWindows())[0].dispose();

Mein Internal Frame stellt kein getOwnedWindow  (this.getOwnedWindow) zur Verfügung,
das einzige was ich könnte wäre ein 
parent.getAllFrames()
was auch funktioniert, es schliesst nach 2 Sekunden das Internal Frame (auch nett).

Wäre sehr dankbar für eine weitere Idee


----------



## dieta (4. Jan 2007)

Gib' vielleicht parent als owner an, dann sollte es über parent.getOwnedWindows klappen.
An sonsten: parent.getAllFrames gibt ja ein Array zurück, da kannst du ja mal einfach ausprobieren, der wievielte Index ein DIalog ist (Er sollte eigentlich der letzte sein).


----------



## Gast (4. Jan 2007)

Hi,

ich denke es geht nicht mit dem optionPane, habe nun drumherumgebaut, trotzdem danke!!!


```
final JDialog d = new JDialog();
				d.setTitle("Speicherung erfolgreich !");
				d.setSize(400,150);
				
				JLabel message_label = new JLabel(message.toString(),JLabel.CENTER);
				this.add(message_label, BorderLayout.CENTER);
				d.setVisible(true);
				
				
				Thread tr1 = new Thread()
				{
				    public void run()
				    {
				        try
				        {
				            Thread.sleep(2000); //<-- Wartezeit in Millisekunden
				            d.dispose();
				        } catch(InterruptedException ex) { }
				    }
				};
				tr1.start();
```


----------



## Gast (5. Jan 2007)

Hie dieta,

wollte das mit dem letzten Element des Arrays probieren, aber es hilft natürlich garnichts:

Das OptionPane wartet solange, bis der Okay-Button gedrückt wird, erst dann wird im Code fortgefahren (also der thread aufgerufen). Das letzte Element ist _dann_ natürlich wieder das Fenster selber 

Was man bräuchte wäre ein thread, der gleichzeitig mit dem OptionPane beginnt. Leider weiss ich nicht wie man sowas macht.


----------



## L-ectron-X (5. Jan 2007)

Bist ja _noch_ nicht angemeldet...

So würde die Methode aussehen, die du benötigst, wenn du das Ganze mit einem JOptionPane lösen willst/musst.

```
public void showTimedDialog(final long millis) {
   JOptionPane pane = new JOptionPane("Dieses Mitteilungsfenster wird automatisch in "+
      String.valueOf(millis/1000)+
      " Sekunden geschlossen.",
      JOptionPane.INFORMATION_MESSAGE);
         
   final JDialog dialog = pane.createDialog(null, "Mitteilung");
   dialog.addWindowListener(new WindowAdapter() {
      public void windowOpened(WindowEvent e) {
         try {
            Thread.sleep(millis);
            dialog.dispose();
         }
         catch(InterruptedException ie) {
            Thread.currentThread().interrupt();
         }
      }
   });
   dialog.setVisible(true);
}
```


----------



## Caramel (8. Jan 2007)

Hi L-ectron-X,

hm, auch das geht nicht (kann nicht, oder ich habs nicht kapiert),
aber auch bei Deiner Lösung wartet das OptionPane (pane) solange, bis der oaky-Knopf gedrückt wird, erst dann wird versucht den Dialog zu öffnen.

Trotzdem Danke für die Mühe, bin schwer beeindruckt!


----------

