# Fenster in den Vordergrund aber nicht im Focus



## Fietzel (28. Nov 2005)

Hallo,

ich versuche einen JDialog in den Vordergrund setzen ohne ihn dabei zu fokussieren, um Statusinformationen permanent anzuzeigen, ähnlich wie beim Taskmanager oder WinAmp. Über 
	
	
	
	





```
implements WindowFocusListener
```
  und der dazugehörigen Methode


```
public void windowLostFocus(WindowEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Lost focus");
		this.toFront();
		
	}
```

kann ich zwar feststellen, wann das Fenster den Focus verliert, aber mit 
	
	
	
	





```
this.toFront();
```
 wird es leider nur innerhalb des Java-Programms in den Vordergrund gebracht, bei jedem anderen Windowsprogramm landet es trotzdem im Hintergrund.

Wie kann man das realisieren?


----------



## The_S (28. Nov 2005)

Hab das ma so gemacht, dass ich nen Thread mitlaufen lassen hab, der das Fenster alle z. B. 50 Millisekunden nach vorne bringt. Hat wunderbar funktioniert und Ressourcenfressend ist das auch net.


----------



## Ilja (28. Nov 2005)

listener ist da schon besser 

wenn du dein dialog erzeugst, versuche bitte:
new JDialog(MyFrame, true);


----------



## The_S (28. Nov 2005)

Ilja hat gesagt.:
			
		

> listener ist da schon besser



Du wirst aber feststellen dass du den seeeeeeeeeeeeeehr einfach austricksen kannst ... :wink:


----------



## Fietzel (28. Nov 2005)

Puh, - jetzt muss ich mich als Anfänger outen

Erklärt mir mal wie das genau geht:


Möglichkeit 1:

Wenn ich 


```
NewJDialog ConfigDialog = new NewJDialog(frame,true);
```

eingebe, sagt er, dass ein entsprechender Konstruktor nicht definiert ist - zurecht. Also wie muss ich den Konstruktor definieren?


Möglichkeit 2:

Das mit dem Thread erscheint mir ganz clever. Aber wie erstelle ich solch einen Überwachungsthread?


----------



## Oni (28. Nov 2005)

versuchs mal so *g*:


```
JDialog configDialog = new JDialog(frame,true);
```


----------



## Ilja (28. Nov 2005)

"frame" ist deine eigene Frame, die das dialogfenster startet


----------



## Guest (28. Nov 2005)

Ahhh, jetzt hab ich auch geschnallt wozu das 
	
	
	
	





```
true
```
 im Konstruktor gut sein soll.
Ihr wollt das ich einen Modalen-Dialog habe. Ich habs jetzt mit 

```
this.setModal(true);
```
ausprobiert. Klappt aber auch nicht. Ich kann einmal ein anderes Fenster anklicken und mein Dialog bleibt im Vordergrund. Beim zweiten Klick auf das Fenster landet mein Dialog wieder im Hintergrund. Er lässt sich also wirklich sehhhhhhhhhhhhr leicht austricksen.

Wie löse ich das Problem mit nem Thread? Wie baue ich nen Thread der meinen Dialog überwacht und ihn periodisch in den Vordergrund stellt?

Das hier ist meine Klasse:


```
public class NewJDialog extends javax.swing.JDialog implements WindowFocusListener,ActionListener{
```

und das der Konstruktor dazu:


```
public NewJDialog(JFrame frame, String[] lclServer, String[] lclSystems, String[] lclSystemID, String[] lclSysServer,int lclTimer, String[] lclactive) {
```

(..ein bischen lang - ich weiß)


----------



## Roar (28. Nov 2005)

setAlwaysOnTop(true) O.O


----------



## Ilja (28. Nov 2005)

das geht erst seit 1.5


----------



## Roar (28. Nov 2005)

Ilja hat gesagt.:
			
		

> das geht erst seit 1.5


na und, ich dachte wir leben nich mehr in der steinzeit


----------



## The_S (28. Nov 2005)

Roar hat gesagt.:
			
		

> setAlwaysOnTop(true) O.O



und auch das kann man umgehen ...


----------



## Roar (28. Nov 2005)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Roar hat gesagt.:
> 
> 
> 
> ...


ja, durch ein anderes alwaysontop fenster oder indem man es einfach minimiert. ist das ein problem? :?


----------



## The_S (29. Nov 2005)

Roar hat gesagt.:
			
		

> Hobbit_Im_Blutrausch hat gesagt.:
> 
> 
> 
> ...



Jup, wenn es wirklich immer im Vordergrund seien soll schon


----------



## Fietzel (29. Nov 2005)

Erstmal danke für den Tipp, er nützt mir leider immer noch nicht viel, da wir hier noch in der Steinzeit leben und kein Java 1.5 installiert haben. - Ich könnte es mir sicherlich schnell installieren, nur müsste ich es dann auf allen anderen Mühlen auf denen mein Programm laufen soll auch tun. - Bzw. die die mein Programm nutzen müssen es auch tun. - Werden die aber nicht machen. (zu dumm..)

Hobbit im Blutrausch, erklär mir bitte wie ich das Ganze mit Hilfe des Überwachungsthreads löse.


----------



## The_S (29. Nov 2005)

```
void starteDiesenThreadGleichZuBeginn()  { // Diesen Thread gleich zu beginn starten ;)
    new Thread(new Runnable() {
        public void run() {
            while(true) {
                frame.toFront();
                try {
                    Thread.sleep(100); // der Abstand in dem immer das Fenster in den Vordergrund gebracht wird
                }
                catch (InterruptedException e) {
                    System.out.println("Thread interrupted");    
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
```

So in etwa.


----------



## Fietzel (29. Nov 2005)

Es funktioniert leider immernoch nicht richtig. Der Thread arbeitet zwar wunderbar, nur der 
	
	
	
	





```
frame.toFront()
```
 Befehl funktioniert scheinbar nicht korrekt.  Mein Fenster bleibt jetzt genau 2x nicht nur im Vordergrund sondern auch im Fokus und beim dritten Klick auf ein anderes Fenster ist eben das geklickte Fenster im Vordergrund und im Fokus. Bei den 2 Klicks bei denen mein Fenster im Fokus bleibt, kann ich eben auch keine Eingaben in andere Fenster machen - die sind ja auch nicht fokusiert.

Hintergrund der ganzen Sache ist Folgender: Ich möchte ein Überwachungstool schreiben das periodisch einen Ping auf verschiedenste Rechner durchführt, um festzustellen ob diese noch verfügbar sind. Ob der angepingte Rechner noch vorhanden ist, soll in einem kleinem Fenster angezeigt werden. Dazu soll das Fenster also immer sichtbar sein, mich bei meiner weiteren Arbeit aber nicht behindern. Und eben diese FensterInDenVordergrundUndWeiterarbeitenGeschichte versuche ich gerade zu realisieren.

Ich hab JAVA j2re1.4.2_08 installiert und entwickle in Eclipse 3.1(oder so) und mit Jigloo. Man kann dabei leider nicht vernünftig debuggen, weil dabei ja das Eclipse den Fokus erhält.

Wenn irgendjemand Alternativen zur toFront() Methode hat oder andere gute Ideen dazu hat, möge er sie posten.


----------



## Illuvatar (29. Nov 2005)

Ich hab nicht alles gelesen, aber wie wäre es wenn du das Programm (Java5) einfach als alwaysOnTop (true) setzt?


----------



## The_S (29. Nov 2005)

Illuvatar hat gesagt.:
			
		

> Ich hab nicht alles gelesen, aber wie wäre es wenn du das Programm (Java5) einfach als alwaysOnTop (true) setzt?



Um mal im Namen von Fietzel zu Antworten  :wink: , er verwendet kein Java 5 und alwaysOnTop lässt sich austricksen.


----------



## Illuvatar (29. Nov 2005)

Hmtja ok selber schuld :bae:

Wie lässt sich austricksen? Also andere alwaysOnTop Fenster können da natürlich auch drüber sein, sonst wäre denen ihr alwaysOnTop ja sinnlos  aber austricksen?


----------



## The_S (29. Nov 2005)

Müsstest du eigentlich am Besten wissen, hast ja dieses lustige Prog des ma net beenden kann Online gestellt. Und da hat ein setAlwaysOnTop ja auch net gereicht .


----------



## Illuvatar (29. Nov 2005)

Naja er will ja auch wohl kaum dass mans net vom Bildschirm wegkriegt, wenn man das ausdrücklich will :bae: aber ich glaube das hat grad net mehr vel mitm Thema zu tun... back@topic, bitte  (ich hab natürlich net gespammt. ein moderator spammt net :bae: )


----------

