2012-06-25 13 views
10

Ich habe einen modalen Einstellungsdialog, der ein JDialog ist. In diesem Einstellungsfenster habe ich einige Komponenten einschließlich einer Schaltfläche zu einem weiteren Modal-Einstellungsdialog platziert, der auch ein JDialog ist. Ich habe sie zu JDialogs gemacht, weil das die einzige Möglichkeit ist, einen modalen Dialog zu erstellen.Wie man einen modalen JDialog über einem anderen modalen JDialog erstellt

Das Problem ist folgendes: Wenn ich den Haupteinstellungen Dialog erstelle, muss ich den JDialog entweder ohne einen übergeordneten Frame oder mit einem übergeordneten Frame erstellen. Da mein Hauptfenster ein JFrame ist, kann ich das einfach an den Konstruktor der Haupteinstellungen übergeben. Aber wenn ich den zweiten modalen Einstellungsdialog erzeugen möchte, der den Haupteinstellungsdialog als Elternteil haben sollte, kann ich keinen Weg finden, den (J) Rahmen des JDialogs zu erhalten. Ich möchte diesen Haupteinstellungsdialog als übergeordnetes Element übergeben, damit sich das zweite Einstellungsdialogfeld darauf konzentriert, wenn es angezeigt wird. Nehmen wir an, der zweite Einstellungsdialog hat keinen Konstruktor zum Übergeben eines Ortes, nur die Konstruktoren des JDialogs.

Gibt es eine Möglichkeit, das (J) Frame eines JDialogs zu bekommen? Gibt es einen Konstruktionsfehler in meinem Setup und sollte ich etwas anderes für diese Einstellungsdialoge verwendet haben? (Und wenn ja, wie soll ich machen diese alternativen Einstellungen Dialoge modal?)

Vielen Dank für Ihre Hilfe, Erik

UPDATE: Vielen Dank für Ihre Antworten. Sie haben mich dazu gebracht zu verstehen, dass es anscheinend nicht unbedingt notwendig ist, einen Besitzer für einen JDialog zu haben. Ich dachte, dies wäre notwendig, damit der Dialog den Besitzer deaktivieren kann, bis der Dialog geschlossen wird, aber anscheinend ist die Modalität unabhängig vom Besitzer. Ich habe auch bemerkt, dass auch bei einem Eigentümer noch der Dialog nicht auf dem Eigentümer nicht zentrieren, so dass nun mein Code wie:

public class CustomDialog extends JDialog { 
    public CustomDialog(String title) { 
     setModal(true); 
     setResizable(false); 
     setTitle(title); 

     buildGUI(); 
    } 

    public Result showDialog(Window parent) { 
     setLocationRelativeTo(parent); 
     setVisible(true); 
     return getResult(); 
    } 
} 

Dies gilt auch für modale Dialoge in modalen Dialogen ermöglicht.

Vielen Dank für Ihre Hilfe!

+0

würde ich einfach nicht machen Das Einstellungsfenster ist modal zu allem. Was ist, wenn sie die Anwendung verwenden müssen, während sie im Einstellungsfenster arbeiten? Es scheint mir sehr restriktiv zu sein. –

Antwort

13

nicht sicher, was genau Sie als ein Problem haben, aber hier ist ein Beispiel, wie Sie mehrere modale Dialoge haben:

import java.awt.BorderLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestDialog { 

    protected static void initUI() { 
     JPanel pane = newPane("Label in frame"); 
     JFrame frame = new JFrame("Title"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(pane); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static JPanel newPane(String labelText) { 
     JPanel pane = new JPanel(new BorderLayout()); 
     pane.add(newLabel(labelText)); 
     pane.add(newButton("Open dialog"), BorderLayout.SOUTH); 
     return pane; 
    } 

    private static JButton newButton(String label) { 
     final JButton button = new JButton(label); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Window parentWindow = SwingUtilities.windowForComponent(button); 
       JDialog dialog = new JDialog(parentWindow); 
       dialog.setLocationRelativeTo(button); 
       dialog.setModal(true); 
       dialog.add(newPane("Label in dialog")); 
       dialog.pack(); 
       dialog.setVisible(true); 
      } 
     }); 
     return button; 
    } 

    private static JLabel newLabel(String label) { 
     JLabel l = new JLabel(label); 
     l.setFont(l.getFont().deriveFont(24.0f)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

Schön, aber warum neue 'JDialog's sind treppenartig geöffnet? – zygimantus

+1

@zygimantus Das wird direkt durch den Aufruf von 'dialog.setLocationRelativeTo (button)' verursacht –

5

1.please lesen The New Modality API in Java SE 6

es 2.Is eine Möglichkeit, die (J) Rahmen eines JDialog zu bekommen?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

oder

Window ancestor = (Window) this.getTopLevelAncestor(); 
Verwandte Themen