Dialog im Vordergrund halten

Status
Nicht offen für weitere Antworten.

AlArenal

Top Contributor
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?
 

AlArenal

Top Contributor
Hauptprogramm:

Code:
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:

Code:
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

    }
}
 

SebiB90

Top Contributor
änder das
Code:
ElementDetailsDialog dialog = new ElementDetailsDialog(Fmea.getTopFrame(), true);
durch das
Code:
ElementDetailsDialog dialog = new ElementDetailsDialog(this, true);
 

thomas.g

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

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

dotlens

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

AlArenal

Top Contributor
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

Top Contributor
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
Code:
//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

Top Contributor
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

Top Contributor
dann lass die variable testFrame weg und mach sofort
Code:
topFrame = new TestFrame();
 

AlArenal

Top Contributor
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

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

AlArenal

Top Contributor
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

Top Contributor
SebiB90 hat gesagt.:
wenn du sagst this geht nicht wegen einem actionlistener dann gib den code des actionlistener auch noch dazu

ActionListener:

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


insertNode(parent, type):

Code:
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

Top Contributor
AlArenal hat gesagt.:
SebiB90 hat gesagt.:
wenn du sagst this geht nicht wegen einem actionlistener dann gib den code des actionlistener auch noch dazu
Ich glaube nicht, dass dir das wirklich weiterhilft um mir weiterzuhelfen ;)
doch das hilft
Code:
    public void actionPerformed(ActionEvent e) {
        tree.insertNode(parent, type, (JFrame)e.getSource());
    }

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

AlArenal

Top Contributor
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

Top Contributor
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
 

Wildcard

Top Contributor
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)
Code:
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

Top Contributor
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?
 

SebiB90

Top Contributor
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

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

CelikBlek

Bekanntes Mitglied
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.
Code:
JDialog jd = new JDialog(frame, title, true);
 

d.ausstroit

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

CelikBlek

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

CelikBlek

Bekanntes Mitglied
Mach mal im Konstruktor von deinem Dialog1 einen Aufruf:
Code:
super(this, true);
Könnte vielleicht schon reichen.
 

d.ausstroit

Bekanntes Mitglied
Dann meckert er "Vor dem Aufruf des Supertyp-Konstruktors kan this nicht referenziert werden". Post doch mal Deinen vollstädigen Code.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Dialog nur anwendungsweit in Vordergrund AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
C FileChooser Save-Dialog zeigt Files nicht an AWT, Swing, JavaFX & SWT 3
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
E Swing Dialog modal aufrufen AWT, Swing, JavaFX & SWT 2
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
T JOptionPane Dialog plus Rechnung ausgeben AWT, Swing, JavaFX & SWT 1
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
J JavaFX Dialog - Style AWT, Swing, JavaFX & SWT 6
D Swing Dynamisches Dialog UI AWT, Swing, JavaFX & SWT 8
H JFileChooser Dateinamen vorgeben (Save Dialog) AWT, Swing, JavaFX & SWT 9
D Neues Dialog Mittig auf dem Bildschirm AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
G Datei öffnen Dialog modifizieren AWT, Swing, JavaFX & SWT 13
W SWT Dialog richtig schließen? AWT, Swing, JavaFX & SWT 0
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
TheWhiteShadow SWT Dialog Titel setzen AWT, Swing, JavaFX & SWT 6
VfL_Freak Darstellungsproblem mit Dialog AWT, Swing, JavaFX & SWT 8
P Swing Dialog zeigt keinen Inhalt in Verbindung mit JFrame AWT, Swing, JavaFX & SWT 18
G Nebenläufiger Prozess mit Dialog AWT, Swing, JavaFX & SWT 2
C Swing Fortschrittsanzeige im Dialog ohne Fortschrittsbalken und Abbruchoption AWT, Swing, JavaFX & SWT 7
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
R DnD in modalem Dialog AWT, Swing, JavaFX & SWT 4
I Dialog zum Speichern? AWT, Swing, JavaFX & SWT 16
M Dialog soll etwas an "Oberklasse" übergeben AWT, Swing, JavaFX & SWT 3
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
hdi Swing Bzgl JFrame & modaler Dialog AWT, Swing, JavaFX & SWT 6
N Modaler Dialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 8
J SWT Dialog in Dialog automatisch öffnen AWT, Swing, JavaFX & SWT 19
H Confirm Dialog erweitern AWT, Swing, JavaFX & SWT 5
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
B Gestaltung eines Optionen-Dialog AWT, Swing, JavaFX & SWT 16
P Swing Option zeitbeschränkt in modalem Dialog anbieten AWT, Swing, JavaFX & SWT 2
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
T SWT Window Builder Pro File Dialog anzeigen AWT, Swing, JavaFX & SWT 10
A Swing Delay (1-4 Sek.) bei JTable und Dialog beim ersten Ausführen AWT, Swing, JavaFX & SWT 3
P Swing modaler dialog AWT, Swing, JavaFX & SWT 3
P SWT Dialog AWT, Swing, JavaFX & SWT 3
O Login Dialog zweimal öffnen AWT, Swing, JavaFX & SWT 2
B Datei öffnen Dialog AWT, Swing, JavaFX & SWT 9
N Swing eigenen Dialog erstellen AWT, Swing, JavaFX & SWT 8
C Swing Fehlermeldung in einem Dialog anzeigen AWT, Swing, JavaFX & SWT 2
L Dialog mit Dauerschleifen AWT, Swing, JavaFX & SWT 4
K SWT TableViewer refresh() im Dialog AWT, Swing, JavaFX & SWT 2
Semox Swing FileSaveAs Dialog Problem AWT, Swing, JavaFX & SWT 14
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
B Dialog aus DB Struktur erstellen AWT, Swing, JavaFX & SWT 4
D URL Dialog AWT, Swing, JavaFX & SWT 2
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
J nicht weckklickbarer dialog AWT, Swing, JavaFX & SWT 15
S Frame - Panel - Dialog rückgabe wert AWT, Swing, JavaFX & SWT 5
D Swing Dialog schließen verhindern bei Fehleingabe AWT, Swing, JavaFX & SWT 2
F JColorChooser NICHT im Dialog AWT, Swing, JavaFX & SWT 12
C Swing Mit jTree ein Ordneröffnen Dialog machen? Und Ordner Inhalt auslesen? AWT, Swing, JavaFX & SWT 4
N SWT Dialog mit swt-widgets AWT, Swing, JavaFX & SWT 5
L AWT Daten vom Dialog an Frame senden AWT, Swing, JavaFX & SWT 3
Lurch Swing Dialog erbt von Dialog? AWT, Swing, JavaFX & SWT 28
eQuest Durchsuchen Dialog AWT, Swing, JavaFX & SWT 6
D ausgewählte Textstellen scheinen durch Dialog durch AWT, Swing, JavaFX & SWT 7
S Modalen Dialog nachbauen..? AWT, Swing, JavaFX & SWT 4
E Swing Rückgabe eines Wertes aus einem Dialog zu einem Dialog AWT, Swing, JavaFX & SWT 4
W Swing Problem beim Passwort Dialog AWT, Swing, JavaFX & SWT 4
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
C requestFocus bei modalem Dialog AWT, Swing, JavaFX & SWT 3
5 Mod.Dialog reagiert n.auf ActionListener seiner Komponenten AWT, Swing, JavaFX & SWT 4
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G SWT Dialog AWT, Swing, JavaFX & SWT 7
GilbertGrape EXIT_ON_CLOSE in Dialog AWT, Swing, JavaFX & SWT 3
T JFileChooser: beim Save Dialog einen Dateinamen vorgeben? AWT, Swing, JavaFX & SWT 6
K Druck-Dialog AWT, Swing, JavaFX & SWT 4
D JTable nach Öffnen-Dialog umbaun AWT, Swing, JavaFX & SWT 5
K Dialog schliesst sich nicht. Warum? AWT, Swing, JavaFX & SWT 11
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
J dialog AWT, Swing, JavaFX & SWT 5
H nicht modaler Dialog verdeckt modalen Dialog AWT, Swing, JavaFX & SWT 5
S Probl. bei Java Programm - Dialog zum Bearbeiten von Bildern AWT, Swing, JavaFX & SWT 4
W Wie macht man so nen Settings Dialog AWT, Swing, JavaFX & SWT 2
K Datei öffnen Dialog AWT, Swing, JavaFX & SWT 5
K Dialog aus einem Dialog öffnen AWT, Swing, JavaFX & SWT 4
S preference dialog öffnen AWT, Swing, JavaFX & SWT 8
spacegaier Fehler beim Aufrufen von Dialog aus ActionListener AWT, Swing, JavaFX & SWT 12
B Confirmation Dialog AWT, Swing, JavaFX & SWT 2
T DIALOG für BEENDEN AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen


Oben