# Programm in den Vordergrund bringen



## Tharsonius (25. Mrz 2010)

Hallo zusammen,

nachdem ich nun sicher gestellt habe, dass mein Programm nur noch einmal gestartet wird möchte ich das ganze nun etwas erweitern. Das neu gestartete Programm wird weiterhin abgebrochen, aber ich möchte dann das bereits laufende Programm in den Vordergrund bringen. Vorzugsweise sollte das Programm dann auch noch den Fokus bekommen.

Das laufende Programm über den Programmstart informieren klappt wunderbar. Nur noch das bringen in den Vordergrund fehlt.

Gibt es da irgend eine Möglichkeit Windows (und auch andere Betriebssysteme) zu veranlassen ein Programm in den Vordergrund zu bringen?


----------



## Guybrush Threepwood (25. Mrz 2010)

Window.toFront() sollte klappen. Geht auch bei JFrame, da dieser von Window erbt.


----------



## Tharsonius (25. Mrz 2010)

Leider passiert außer einem Blinken meines Programms in der Taskleiste nichts.

Das Programm wird weder in den Vordergrund geholt, noch bekommt es den Fokus.

Mit dem Blinken kann ich leben, so wird der Nutzer immerhin darauf aufmerksam und merkt, dass da bereits eine Instanz läuft.
Aber schöner wäre es, wenn diese sich auch in den Vordergrund bringen würde.


----------



## Jens81 (25. Mrz 2010)

z.B. so kannst du einen bereits geöffneten Dialog in den Vordergrund holen 


```
for (int i=0; i < Window.getWindows().length; i++) {
	try {
		JDialog dia = (JDialog)Window.getWindows()[i];
		if (dia.isVisible()) {
			if ((Window.getWindows()[i]) instanceof MeinDialogFenster) {
				((MeinDialogFenster)Window.getWindows()[i]).toFront();
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}
```


----------



## Guybrush Threepwood (25. Mrz 2010)

Es ist so eine Sache: Programme, die sich selbstständig in den Vordergrund mogeln können ziemlich nerven. Ich kann mir vorstellen, dass das in Windows bewusst unterbunden wird. Ein paar Workarounds gibt es hier: Howto bring a Java window to the front? - Stack Overflow

Das könnte funktionieren (ungetestet):

```
if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
toFront();
repaint();
```


----------



## Tharsonius (25. Mrz 2010)

Es ist mir bewusst, dass das nervt, wenn ein Fenster dauerhaft etwas verdeckt und man das nicht aus dem Weg bekommt.
Sowas will ich auch gar nicht erreichen.

Der Nutzer soll grundlegend machen können was er will, in Bezug auf Größe, minimiert, maximiert etc.
Da ich aber einen doppelten Programmstart unterbinde wirkt das natürlich auf den ersten Blick als würde sich nichts tun.

Daher möchte ich den Nutzer beim erneuten Programmstart darauf aufmerksam machen, dass das Programm bereits läuft. Nur in diesem Augenblick sollte sich das laufende Programm also in den Vordergrund bringen, anstatt dass eine neue Instanz gestartet wird.



> if(getState()!=Frame.NORMAL) { setState(Frame.NORMAL); }
> toFront();
> repaint();


Leider ändert dies auch nichts am Verhalten, es bleibt bei einem Blinken des Programms in der Taskleiste.


Ich hab mir auch mal Deinen Link angesehen, scheint demzufolge wirklich etwas zu sein, was von Windows abhängt, weil XP (was ich hier auch nutze) das Fokus Stehlen per default unterbindet. Auf Vista soll das anders sein...
Ich werde das heute abend mal bei mir daheim probieren, wie sich das alles auf Windows 7 verhält. Linux kann ich nicht testen...

Na ja, alles in allem kann ich auch mit dem Blinken leben. Wichtig ist, dass sich überhaupt irgendwas tut und der Nutzer eine Reaktion bemerkt.

Erst mal vielen Dank.


----------



## Guybrush Threepwood (25. Mrz 2010)

Wenn Du ausschließlich auf Windows arbeitest, dann könnte ein Launcher wie launch4j für Dich interessant sein. Der macht - glaube ich - das, was Du möchtest: Wenn bereits eine Instanz des Programms läuft, dann wird diese nach vorne geholt anstatt ein neues Fenster aufzumachen.


----------



## KrokoDiehl (25. Mrz 2010)

Schonmal probiert ob du nicht nur ein 
	
	
	
	





```
toFront()
```
 brauchst sondern auch direkt den Fokus verlangen musst?
Ich meine:

```
meinFenster.toFront();
meinFenster.requestFocus();
```
War so eine spontane Idee.

Ansonsten gibt es vielleicht ein paar Tricksereien mit 
	
	
	
	





```
setAlwaysOnTop()
```
 ... aber wie gesagt: Trickserei.


----------



## Tharsonius (29. Mrz 2010)

KrokoDiehl hat gesagt.:


> Schonmal probiert ob du nicht nur ein
> 
> 
> 
> ...



Leider bringt das auch nichts. Das JFrame.requestFocus(); macht überhaupt nichts, kein sichtbares Ergebnis. 

Alles in allem habe ich das am Wochenende auch mal unter Windows 7 ausprobiert, das gleiche Ergebnis. Windows scheint das wirklich zu unterbinden und stattdessen die Taskleiste blinken zu lassen.

Mit setAlwaysOnTop() habe ich auch mal etwas probiert. Damit bekomme ich das Fenster in den Vordergrund, das klappt problemlos, aber nur, wenn das Fenster nicht minimiert ist. Das Fenster selber bekommt dann aber trotzdem den Fokus nicht sondern blinkt wiederum in der Taskleiste.

Alles in allem bringt mich das zu dem Schluss, dass Windows verhindert, wenn ein Programm den Fokus haben will. Kann man eventuell in der Regestry umstellen, habe dazu was gefunden, da wollte ich aber nicht dran herumfummeln.




Unterm Strich möchte ich die Kompartibilität zu Linux / Unix auch nicht aufgeben, auch wenn ich das derzeit nicht da testen kann (muss das erst wieder installieren  ) soll das Programm dennoch da laufen.



Ich kann mit dem Blinken sehr gut leben, das ist eine Reaktion, die der Nutzer sieht. Das Thema hat sich somit erledigt.
Danke Euch.


----------

