Swing Mehrere Modal-Dialoge übereinander

sven-meye

Mitglied
Hallo zusammen,

wahrscheinlich ist es eine dumme Frage. Leider funktioniert nichts, dass ich im Internet finde. Ich habe ein Frame, das einen Dialog zum Erstellen eines Datensatzes aufruft. In diesem Dialog hat es wiederum einen Button der einen weiteren Dialog öffnet um einen Kunden auszuwählen. Beide sind modal. Nun habe ich das Problem, dass sich der erste Dialog über den zweiten Dialog legt, wenn ich den zweiten Dialog öffne. Danach kann ich den zweiten Dialog nicht mehr öffnen, weil der erste Dialog Modal ist. Hat da jemand einen Tipp? Mit den verschiedenen Modal_Types, toFront(), requestFocus(), usw. habe ich bereits ein bisschen experimentiert. Ich habe kein Parent oder so, das System habe ich nicht ganz verstanden. Liegt es eventuell daran?

Achja und gleich noch eine kleine Frage im Anschluss. Wenn ich nun das Programm nicht mehr fokusiere, bzw. minimiere, rückt das Modal in den Hintergrund. Weil es kleiner als das Frame ist, kann ich es dann nicht mehr anklicken. Was dazu führt, dass ich das Programm neustarten muss.

Freundliche Grüsse & vielen Dank im Voraus
sven_meye
 
Hallo sven_meye
Denke es liegt wir du schon vermutest daran das du den Parent nicht verwendest.

Ich hab mal eine kleine Test Klasse geschrieben und kann das so nicht nachvollziehen wie du das sagst. Du kannst ja ein wenig damit rumprobieren aber ich denke das du so siehst wie du die Parents verwenden kannst bzw. must.

Java:
import javax.swing.*;
import java.awt.*;

public class MyTestFrame extends JFrame {

    public MyTestFrame() throws HeadlessException {

        setTitle("Dialog Test");
        setSize(600, 400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JButton testButton = new JButton("Open Dialog 1");
        testButton.addActionListener(e -> new MyTestDialog(this, 1).setVisible(true));
        add(testButton);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MyTestFrame().setVisible(true));
    }

    private class MyTestDialog extends JDialog {
        public MyTestDialog(Frame owner, int instance) { super(owner); init(instance); }
        public MyTestDialog(Dialog owner, int instance) { super(owner); init(instance); }

        private void init(int instance) {
            System.out.println(getOwner());
            setTitle("Test Dialog " + instance);
            setSize(300, 200);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setLocationRelativeTo(getOwner());
            setModal(true);

            JButton testButton = new JButton("Open Dialog " + (instance + 1));
            testButton.addActionListener(e -> new MyTestDialog(this, instance + 1).setVisible(true));
            add(testButton);
        }
    }
}
 
Mit JFrame.setLocation könntest du ja den Ort festlegen, wo die Dialoge angezeigt werden (damit sie nichtmehrhinter dem anderen verschwinden)
-> Oder sind die Beiden auf einem JFrame?

und hier meine Methode für den Fokus (Hab ich bis jetzt nur Für Textfelder und Buttons benutzt):
Java:
public static void setzeFocus(JComponent myComponent) {
    EventQueue.invokeLater(new Runnable() {

      @Override
      public void run() {
        myComponent.grabFocus();
        myComponent.requestFocus();
      }
    });
  }
 
@incluedu Hmmm... ich kriege dann immer die Meldung das es kein AWT.Dialog sei. Liegt es möglicherweise daran, dass es verschiedene Dialoge sind? Ich übergebe Dialog 2 den Dialog 1. Aber funktioniert noch nicht.

@Viktim Das hatte ich versucht :S funktioniert leider nicht.
 
@incluedu Ach sry 🙂 da hat sich glatt noch ein kleiner dummer Fehler eingeschlichen! Es läuft, vielen Dank. Ich habe keine ahnung warum ich das im ersten Anlauf selbst nicht hinbekommen habe 😵 sieht eigentlich relativ simpel aus.

Noch eine kleine Frage im Anschluss. Sollte man das mit dem Parent immer machen oder ist es kein Weltuntergang, wenn mans weg lässt? Habe ca. 40 Dateien die ich jetzt anpasssen müsste 😱
 
Noch eine kleine Frage im Anschluss. Sollte man das mit dem Parent immer machen oder ist es kein Weltuntergang, wenn mans weg lässt? Habe ca. 40 Dateien die ich jetzt anpasssen müsste 😱

Naja wenn du es nicht machst dann hast halt das Problem das es dir passieren kann das der Dialog oder der Frame hinter dem anderen verschwindet. Das ist halt nicht sehr schön. Ob du es machst oder nicht ist wohl dir überlassen weil wenn es nicht möglich wäre würde es auch nicht funktionieren und das tut es ja. Aber sauberer, finde zumindest ich, ist es wenn du immer einen Parent setzt, und soviel arbeit ist das ja auch nicht selbst bei 40 Klassen.
 

Zurück
Oben