# Dialog im Vordergrund halten



## AlArenal (22. Mrz 2005)

Nerviges Problem:

Eine Anwendung (JFrame) öffnet einen JDialog. Der Anwender wechselt z.B. in der Taskbar zu einer anderen Anwendung und switcht dann wieder zurück und dummerweise überdeckt nun der JFrame den JDialog. Da der (modale) JDialog den JFrame sperrt, ist es dann immer fricklig wieder den JDIalog in den Vordergrund zu bekommen. 

Dummerweise ergibt JFrame.getOwnedWindows().length  immer 0, obwohl ich den JFrame im Konstruktor des JDialogs explizit als Parent angebe. Somit kann ich auch über einen WindowFocusListener im JFrame nicht mal eben ein JDialog.toFront() machen...

Kennt da wer die Lösung?


----------



## KSG9|sebastian (22. Mrz 2005)

kannste bissl code posten ?


----------



## Sky (22. Mrz 2005)

Da hilft Dir die Methode 'setAlwaysOnTop'.


----------



## AlArenal (22. Mrz 2005)

Hauptprogramm:


```
public class Fmea {
    private static JFrame topFrame = null;

    public static JFrame getTopFrame() {
        return topFrame;
    }

    public static void main(String[] args) {
        TestFrame testFrame = new TestFrame();
        topFrame = testFrame;
        testFrame.setTitle("TestFrame: main2.fld");
        testFrame.setSize(950, 700);
        testFrame.show();
    }
}
```

Der JFrame  mit dem Listener:


```
public class TestFrame extends JFrame {
    public TestFrame() throws HeadlessException {  
        super();        
        addWindowFocusListener(new MyWindowFocusListener(this));
        ElementDetailsDialog dialog = new ElementDetailsDialog(Fmea.getTopFrame(), true);
    }
}

class MyWindowFocusListener implements WindowFocusListener {
    private JFrame frame = null;
    
    public MyWindowFocusListener(JFrame frame) {
        this.frame = frame;
    }
    
    /* (non-Javadoc)
     * @see java.awt.event.WindowFocusListener#windowGainedFocus(java.awt.event.WindowEvent)
     */
    public void windowGainedFocus(WindowEvent e) {
        Window[] windows = frame.getOwnedWindows();
        for (int i = 0; i < windows.length; i++) {
            windows[i].toFront();
        }
    }

    /* (non-Javadoc)
     * @see java.awt.event.WindowFocusListener#windowLostFocus(java.awt.event.WindowEvent)
     */
    public void windowLostFocus(WindowEvent e) {
        // TODO Auto-generated method stub

    }
}
```


----------



## AlArenal (22. Mrz 2005)

sky80 hat gesagt.:
			
		

> Da hilft Dir die Methode 'setAlwaysOnTop'.



Ja? In welcher Klasse? Jedenfalls nicht in JDialog


----------



## Wildcard (22. Mrz 2005)

AlArenal hat gesagt.:
			
		

> sky80 hat gesagt.:
> 
> 
> 
> ...


Doch! Glaube aber erst seit Java 5


----------



## AlArenal (22. Mrz 2005)

Ich suche aber eine Lösung für 1.4.2


----------



## SebiB90 (22. Mrz 2005)

änder das

```
ElementDetailsDialog dialog = new ElementDetailsDialog(Fmea.getTopFrame(), true);
```
durch das

```
ElementDetailsDialog dialog = new ElementDetailsDialog(this, true);
```


----------



## thomas.g (22. Mrz 2005)

gehts das normal nicht mit:
this.setAlwaysOnTheTop(true);

---> am besten geht das in den GUI eigenschaften!


----------



## Roar (22. Mrz 2005)

thomas.g hat gesagt.:
			
		

> gehts das normal nicht mit:
> this.setAlwaysOnTheTop(true);
> 
> ---> am besten geht das in den GUI eigenschaften!





			
				AlArenal hat gesagt.:
			
		

> Ich suche aber eine Lösung für 1.4.2


----------



## dotlens (23. Mrz 2005)

wenn du dem JDialog dein Hauptframe übergibst, macht er alles korekt. Wie sebi auch in seinem code zeigt... ;-)


----------



## AlArenal (23. Mrz 2005)

Das hatte ich im Grunde mit FMEA.getTopFrame() ja auch versucht. Das Hauptklasse hat ne statische Methode die den Hauptframe der Anwendung zurückgibt und die habe ich testeshalber bei der Instanziierung des Dialgs benutzt:

Aber das funzt nunmal nicht.


----------



## SebiB90 (23. Mrz 2005)

AlArenal hat gesagt.:
			
		

> Das hatte ich im Grunde mit FMEA.getTopFrame() ja auch versucht. Das Hauptklasse hat ne statische Methode die den Hauptframe der Anwendung zurückgibt und die habe ich testeshalber bei der Instanziierung des Dialgs benutzt:
> 
> Aber das funzt nunmal nicht.


ist klar das das nicht funzt

du machst das so

```
//main methode
TestFrame testFrame = new TestFrame(); 
//construktor
//..
//hier ist die variable topFrame nicht initalisiert, also liefert getTopFrame() null
ElementDetailsDialog dialog = new ElementDetailsDialog(Fmea.getTopFrame(), true); 

//main methode wieder
//jetzt erst wird die variable topFrame initalisiert
topFrame = testFrame;
```
deshalb sollst du this benutzen dann geht das schon, probier es aus


----------



## AlArenal (23. Mrz 2005)

This bringt mich an der Stelle nicht weiter, weil ich mich im echten Code im ActionListener eins MenuItems befinde.... Wie ich bereits schrieb ist der Code etwas vereinfacht, weil das Ganze hier sonst zu komplex werden würde...

Das Programm (Klasse Fmea) startet, öffnet TestFrame. In diesem gibts dann irgendwo ein PopupMenu und die MenuItems haben einen Listener, der eine Dialogbox öffnet. Zu diesem Zeitpunkt ist topFrame natürlich schon lange initialisiert, weil direkt nach TestFrame test = new TestFrame(); in Fmea die Zeile topFrame = test; kommt....


----------



## SebiB90 (23. Mrz 2005)

dann lass die variable testFrame weg und mach sofort

```
topFrame = new TestFrame();
```


----------



## AlArenal (23. Mrz 2005)

SebiB90 hat gesagt.:
			
		

> dann lass die variable testFrame weg und mach sofort
> 
> ```
> topFrame = new TestFrame();
> ```



Dann hab ich ne Variable gespart, aber das ändert nichts daran, dass es nicht funzt.


----------



## SebiB90 (23. Mrz 2005)

AlArenal hat gesagt.:
			
		

> SebiB90 hat gesagt.:
> 
> 
> 
> ...


hast du es ausprobiert?    
gib mal den längeren code


----------



## AlArenal (23. Mrz 2005)

Ich habs ausprobiert.

Ich wüsste nicht was ich noch an Code rausgeben könnte. Wir reden hier von 30 Klassen (ist noch im frühen Stadium) und im Grunde enthält der von mir bereits gepostet Code alles hierfür relevante. 

Punkt ist: Es geht nicht! 

Entweder startet man ne Klickorgie oder darf sich den Dialog unter Windows mit Alt-Tab wieder ranholen.


----------



## SebiB90 (23. Mrz 2005)

wenn du sagst this geht nicht wegen einem actionlistener dann gib den code des actionlistener auch noch dazu


----------



## AlArenal (23. Mrz 2005)

Einzige Lösung die mir noch einfallen würde, wäre die Erzeugung von Dialogen oder Fenstern allgemein intern über ne Zentrale zu erledigen, die das Ganze mitprotokolliert und wenn der WindowFocusListener im Hauptframe Alarm schlägt den zu durchlaufen und ein toFront() zu machen...


----------



## AlArenal (23. Mrz 2005)

SebiB90 hat gesagt.:
			
		

> wenn du sagst this geht nicht wegen einem actionlistener dann gib den code des actionlistener auch noch dazu



ActionListener:


```
public void actionPerformed(ActionEvent e) {
        tree.insertNode(parent, type);
    }
```


insertNode(parent, type): 


```
public void insertNode(FMEAInterface parent, int type) {
//        log.debug("parent " + parent + " - type " + type);
        
        /*
         * Abbruchbedingung
         */ 
        if (parent == null) {
            log.error("parent is null");
            return;
        }
        
        /*
         * Der neue Node
         */
        FMEAInterface obj = null;        
        
        /*
         * Je nach gewünschtem Typ, erzeugen wir eine neue Instanz
         * der jeweiligen Klasse.
         */
        switch (type) {
        case FMEAInterface.TYPE_ACTION_GROUP: {
            obj = new ActionGroup();                  
            break;
        }
        
        case FMEAInterface.TYPE_CHARACTERISTIC: {
            obj = new Characteristic();
            break;
        }
        
        case FMEAInterface.TYPE_DETECTION_ACTION: {
            obj = new DetectionAction();
            break;
        }
        
        case FMEAInterface.TYPE_FUNCTION: {
            obj = new Function();
            break;
        }
        
        case FMEAInterface.TYPE_MALFUNCTION: {
            obj = new Malfunction();
            break;
        }
        
        case FMEAInterface.TYPE_PREVENTION_ACTION: {
            obj = new PreventionAction();
            break;
        }
               
        default:
            log.error("unknown TYPE: " + type);
        	return;
        }
        
        /*
         * Den Dialog zur Bearbeitung der Objekt-Daten öffnen.
         */
        obj.getTitle().setText("neu");
        System.out.println("Fmea.getTopFrame() = "+Fmea.getTopFrame());
        ElementDetailsDialog dialog = new ElementDetailsDialog(Fmea.getTopFrame(), obj);
//        ElementDetailsDialog dialog = new ElementDetailsDialog(this, obj);
        dialog.setVisible(true);
        /*tet
         * Dialog-Status prüfen und entsprechend agieren
         */
        if (!dialog.isCancelled()) insertNode(obj);
        /*
         * Dialog entfernen
         */
        dialog.dispose();
        
    }
```

Ich glaube nicht, dass dir das wirklich weiterhilft um mir weiterzuhelfen


----------



## SebiB90 (23. Mrz 2005)

AlArenal hat gesagt.:
			
		

> SebiB90 hat gesagt.:
> 
> 
> 
> ...


doch das hilft

```
public void actionPerformed(ActionEvent e) {
        tree.insertNode(parent, type, (JFrame)e.getSource());
    }
```


```
public void insertNode(FMEAInterface parent, int type, JFrame parentFrame) {
        //..
        ElementDetailsDialog dialog = new ElementDetailsDialog(parentFrame, obj);
        //..       
    }
```


----------



## AlArenal (23. Mrz 2005)

Wie ich bereits schrieb ist das der ActionListener eines MenuItems. Da wird e.getSource() nen Teufel tun und mir etwas liefern was Frame oder Dialog implementiert


----------



## SebiB90 (23. Mrz 2005)

um dir weiter zu helfen brauch ich alle klasse die zwischen der klasse mit der main methode und dem actionlistener liegen bzw. so main->frame->.../(alle klassen hierzwischen)->actionlistener


----------



## AlArenal (23. Mrz 2005)

Wenn ich hier 1200 Zeilen Code poste, werde ich gelyncht....


----------



## Wildcard (23. Mrz 2005)

Hmm, ich hab mir deinen Code mal angesehen, und da ich den ElementDetailsDialog nicht hab, hab ich ihn durch
einen normalen JDialog ersetzt. Dann funktioniert dein Code (auch ohne den Listener anstandslos)

```
public class TestFrame extends JFrame { 
    public TestFrame() throws HeadlessException {  
        super();        

        JButton button = new JButton("Dialog");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                // TODO Auto-generated method stub
                JDialog dialog = new JDialog(Fmea.getTopFrame(), true); 
                dialog.setSize(200,100);
                dialog.setVisible(true);
            }
        });
        add(button);
    } 
}
```
Kann es auch an dem Dialog liegen?


----------



## AlArenal (23. Mrz 2005)

Moment... du hast ein Programm, öffnest darin den Dialog, hast irgendwo noch einen Explorere oder sonstwas in Fullscreen, holst den in den Vordergrund, klickst in der Taskleiste auf dein Java-Prog und der Dialog erscheint vor dem Hauptframe?


----------



## Wildcard (23. Mrz 2005)

Genau


----------



## SebiB90 (23. Mrz 2005)

AlArenal hat gesagt.:
			
		

> Moment... du hast ein Programm, öffnest darin den Dialog, hast irgendwo noch einen Explorere oder sonstwas in Fullscreen, holst den in den Vordergrund, klickst in der Taskleiste auf dein Java-Prog und der Dialog erscheint vor dem Hauptframe?


so soll es auch sein, normalerweise :roll:


----------



## AlArenal (23. Mrz 2005)

Verfluchte Sch....!!!!


----------



## Wildcard (23. Mrz 2005)

AlArenal hat gesagt.:
			
		

> Verfluchte Sch....!!!!


Hast du's rausgefunden?


----------



## AlArenal (23. Mrz 2005)

Nein.. vor morgen schau ich da auch nicht mehr rein. Schnauze voll! Das sind so Kleinigleiten, wo man manchmal die Wand hochgehen könnte...


----------



## d.ausstroit (15. Jun 2005)

Hai AlArenal. Haste mittlerweile Dein Problem lösen können. Wäre supi, wenn Du mir die Lösung postest.

Dirk


----------



## CelikBlek (17. Jun 2005)

Das geht auch einfacher. 
Wenn man den Konstruktor vom JDialog() beim erzeugen das Wert für modal true übergibt dann bleibt er im Vordergrund bis es abgeschlossen ist.

```
JDialog jd = new JDialog(frame, title, true);
```


----------



## d.ausstroit (17. Jun 2005)

Das Problem ist, meine Klasse aus der der Dialog aufgerufen wird, ist kein Frame sondern ein APPLET. Geht das dann auch so?


----------



## CelikBlek (17. Jun 2005)

Musste auch gehen. Habe es zwar nie ausprobiert, aber irgendwo erzeugst du doch den JDialog doch auch. Beim erzeugen, was übergibst du ihm denn?


----------



## d.ausstroit (17. Jun 2005)

Schau Dir bitte mal das Thema an, da steht auch mein Code.


----------



## CelikBlek (17. Jun 2005)

Mach mal im Konstruktor von deinem Dialog1 einen Aufruf:

```
super(this, true);
```
Könnte vielleicht schon reichen.


----------



## d.ausstroit (17. Jun 2005)

Das habe ich schon versucht (siehe Thema) Ganz am Ende.


----------



## CelikBlek (17. Jun 2005)

Übergebe es doch einfachmal im Konstruktor. Bei mir geht es. Habe es gerade ausprobiert.


----------



## CelikBlek (17. Jun 2005)

Und nicht den owner übergeben sondern this.


----------



## d.ausstroit (17. Jun 2005)

Dann meckert er "Vor dem Aufruf des Supertyp-Konstruktors kan this nicht referenziert werden". Post doch mal Deinen vollstädigen Code.


----------

