2012-06-25 12 views
10

Mam okno dialogowe ustawień modalnych, które jest JDialogiem. W tym oknie ustawień umieściłem kilka komponentów, w tym przycisk do jeszcze jednego okna ustawień modalnych, który jest również JDialogiem. Zrobiłem je JDialogs, ponieważ jest to jedyny sposób, jaki znam, aby stworzyć dialog modalny.Jak utworzyć modalny JDialog na innym modalnym JDialogu

Problem polega na tym, że gdy utworzę główne okno dialogowe, muszę skonstruować JDialog bez ramki rodzica lub z ramką rodzica. Ponieważ moim głównym oknem jest JFrame, mogę po prostu przekazać to do głównego konstruktora okna dialogowego ustawień. Ale gdy chcę utworzyć drugie okno dialogowe ustawień modalnych, które powinno mieć główne okno dialogowe ustawień jako rodzic, nie mogę znaleźć sposobu, aby uzyskać ramkę (J) JDialog. Chciałbym przekazać to główne okno dialogowe ustawień jako rodzic, aby okno drugiego ustawienia stało się na środku, gdy zostanie wyświetlone. Załóżmy, że drugie okno dialogowe ustawień nie ma konstruktora do przekazania lokalizacji, tylko konstruktorów JDialog.

Czy istnieje sposób, aby uzyskać ramkę (J) JDialog? Czy w mojej konfiguracji występuje błąd projektowy i czy powinienem użyć czegoś innego w tych oknach dialogowych ustawień? (A jeśli tak, to jak mam zrobić te alternatywne ustawienia dialogi modalne?)

Dziękuję za pomoc, Erik

UPDATE: Dziękuję wszystkim za odpowiedzi. Doprowadzili mnie do zrozumienia, że ​​najwyraźniej nie jest absolutnie konieczne posiadanie właściciela JDialoga. Myślałem, że jest to potrzebne, aby dialog mógł wyłączyć właściciela, dopóki okno dialogowe nie zostanie zamknięte, ale najwyraźniej modalność jest niezależna od właściciela. Zauważyłem również, że nawet właściciel okno nadal nie koncentrować się na właściciela, więc teraz mój kod jest jak:

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(); 
    } 
} 

Pozwala to również na modalnych okien dialogowych w modalnych okien dialogowych.

Dzięki za pomoc!

+0

I nie byłoby po prostu zrobić okno ustawień może być modalne do czegokolwiek. Co zrobić, jeśli muszą korzystać z aplikacji, gdy pracują w oknie ustawień? Wydaje mi się to bardzo restrykcyjne. –

Odpowiedz

13

Nie wiem, co dokładnie masz za problem, ale tutaj jest przykładem, w jaki sposób można mieć wiele modalnych okien dialogowych:

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

Fajnie, ale dlaczego nowe 'JDialog' są otwarte w sposób klatka schodowa? – zygimantus

+1

@zygimantus Jest to bezpośrednio spowodowane wywołaniem 'dialog.setLocationRelativeTo (button)' –

5

1.Please czytać The New Modality API in Java SE 6

2.Jest istnieje sposób, aby uzyskać (J) klatka JDialog?

Window ancestor = SwingUtilities.getWindowAncestor(this); 

lub

Window ancestor = (Window) this.getTopLevelAncestor(); 
Powiązane problemy