Как создать модальный JDialog поверх другого модального JDialog

У меня есть диалог модальных настроек, который является JDialog. В этом окне настроек я поместил некоторые компоненты, включая кнопку, в еще один диалог модальных настроек, который также является JDialog. Я сделал их JDialogs, потому что это единственный способ узнать модальный диалог.

Проблема заключается в следующем: когда я создаю диалог основных настроек, я должен построить JDialog либо без родительского фрейма, либо с родительским фреймом. Поскольку мое главное окно - это JFrame, я могу просто передать это в конструктор диалога основных настроек. Но когда я хочу создать второй диалог модальных настроек, который должен иметь диалог основных настроек в качестве родителя, я не могу найти способ получить (J) фрейм JDialog. Я хочу передать этот диалог основных настроек в качестве родителя, чтобы второй диалог настроек находился на нем, когда он отображается. Предположим, что второй диалог настроек не имеет конструктора для передачи местоположения, а только конструкторы JDialog.

Есть ли способ получить (J) кадр JDialog? Есть ли дефект дизайна в моей настройке, и должен ли я использовать что-то еще для этих диалогов настроек? (И если да, как мне сделать эти альтернативные диалоги настроек модальными?)

Спасибо за помощь, Erik

UPDATE: Спасибо всем за ваши ответы. Они заставили меня понять, что, по-видимому, не обязательно иметь владельца JDialog. Я думал, что это необходимо для диалога, чтобы отключить владельца, пока диалог не будет закрыт, но, видимо, модальность не зависит от владельца. Я также заметил, что даже с владельцем диалог все еще не сосредотачивается на собственнике, поэтому теперь мой код похож:

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

Это также позволяет модальные диалоги в модальных диалогах.

Спасибо за вашу помощь!

Ответ 1

Не уверен, что у вас есть проблема, но вот пример того, как вы можете иметь несколько модальных диалогов:

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

Ответ 2

1.пожалуйста, прочитайте API новой модальности в Java SE 6

2. Есть ли способ получить (J) кадр JDialog?

Window ancestor = SwingUtilities.getWindowAncestor(this);

или

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