# JDialog verschwindet bei Windowwechsel trotz modal



## AndyHoltmann (19. Jan 2006)

Tach!

Hab eine Klasse Dialog geschrieben, die von JDialog abgeleitet ist. Diese Klasse wird durch Knopfdruck des Hauptframes aktiviert.

Der Dialog öffnet sich auch wie gewünscht, aber er bleibt nicht immer im Vordergrund! Ich habe den dialog zwar modal gesetzt, wenn ich aber nun in ein anderes fenster wechsel oder alle anderen programme minimiere und dann wieder zurück zu meinem Fenster will, ist der Dialog verschwunden und ich kann den aufrufenden Frame nicht beenden sondern nur noch abschießen, da der dialog eine aktion erwartet. nur leider ist er nicht da ??

Andy


----------



## AlArenal (19. Jan 2006)

Schau dir mal die Konstruktoren von JDialog an, da kannste deinen Frame als parent übergeben, dann funzt es auch mit dem Taskswitch...


----------



## AndyH (21. Jan 2006)

ah vielen dank!

aber ich noch folgendes problem:

der dialog wird von einem applet aus aufgerufen, und der konstruktor von jdialog bietet ja kein applet als owner. wie kann man das denn im falle von applets lösen ?

nochmals herzlichen dank!

Andy


----------



## Guest (21. Jan 2006)

hallo nochmal, 
also ich habe hier den thread gefunden, der genau das problem beschreibt:

http://www.java-forum.org/de/viewtopic.php?t=19145&highlight=focuslistener

das funktioniert auch!

und im java sun forum den folgenden:

http://forum.java.sun.com/thread.jspa?threadID=654054&messageID=3844733

allerdings weiß ich überhaupt nicht, wie man die da beschriebene möglichkeit einsetzen kann. weiß jemand vielleicht wie und wo (AppletKlasse, JDialogKlasse) ich diese methode einsetzen kann um dem Jdialog im konstruktor mein applet als "frame" übergeben kann?

Frame f = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this);


----------



## Bleiglanz (21. Jan 2006)

> Der Dialog öffnet sich auch wie gewünscht, aber er bleibt nicht immer im Vordergrund! Ich habe den dialog zwar modal gesetzt, wenn ich aber nun in ein anderes fenster wechsel oder alle anderen programme minimiere und dann wieder zurück zu meinem Fenster will, ist der Dialog verschwunden und ich kann den aufrufenden Frame nicht beenden sondern nur noch abschießen, da der dialog eine aktion erwartet. nur leider ist er nicht da ??


du hast: 

ein native-Window (Peer) für das alte awt Applet

und

ein native-Window (Peer) für den JDialog

=> da funzt dann der ganze Schrott mit der Z-Order, dem Focus-Cycle usw. in Swing nicht mehr...


```
Frame f = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this);
// im Applet = this = das Applet
```
und die obige Zeile liefert dir einfach das Elter im Komponentenbaum vom Typ Frame, also das Ding, auf dem das Applet lebt

=> dieses übergibst du im Konstruktor vom JDialog


----------



## Guest (21. Jan 2006)

ok, aber wie mach ich das nun konkret. da fehlt mir leider noch das nötige hintergrundwissen um das so jetzt hinzubekommen. Könntest du mir das zeigen bitte, Bleiglanz? Hab hier auch schon die nötigen Fragmente:


```
public class Info extends JDialog
{
     

      public Info()
     { 
          
     }
}
```
und

```
public class AppletGui extends JApplet
{
        
        public void init()
       { 
            
       }

        //meine Methoden
     
}
```

Büütte


----------



## Bleiglanz (21. Jan 2006)

```
public class Info extends JDialog{
      public Info(Applet appl){
         super((Frame)SwingUtilities.getAncestorOfClass(Frame.class, appl));
     }
}

public class AppletGui extends JApplet {       
        public void init(){
           Info meinInfo = new MeinInfo(this);
       }
}
```
nicht getestet


----------



## Guest (21. Jan 2006)

achso, nicht dass mir jemand unterstellt ich bemühe micht nicht selber. Der 5. Versuch sieht nun so aus und der compiler bleibt hier auch schön brav, aber in der eclipse appletvievervorschau funzt das immer nocht nicht. 




```
public class AppletGui extends JApplet
{
        //...
       public Frame frame = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this); 
       
        public void init()
       {
           
       }

        //meine Methoden
     
}
```


```
public class Info extends JDialog
{
     

      public Info(AppletGui a)
     {
         super(a.frame);
         setModal(true);
         //...
     }
}
```

Ist das so richtig?


----------



## Bleiglanz (21. Jan 2006)

public Frame frame = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, this); 

das ist Quark, was soll this an der Stelle sein wenn noch nicht mal der Konstruktor gestartet wurde? möglicherweise gibts da noch gar keinen Frame im Objektbaum


----------



## Guest (21. Jan 2006)

Super, die Lösung von Bleiglanz geht!

Damit wäre das Problem einfach gelöst 

Schön, dass es Leute gibt, die wirklich Ahnung haben und unkompliziert helfen 

Daanke!

Mfg
Andy


----------

