多个JDialogs模态到父级?

时间:2016-11-11 20:10:28

标签: java swing modal-dialog jdialog

我有一个JFrame,可以在按钮点击时启动对话框。我想要一个不同的按钮来启动2+对话框,这些对话框是父框架的模态(允许两个对话框的并排比较和交互,但不允许用户与父框架交互)。是否可以使用对话框执行此操作,还是应该使用框架?

2 个答案:

答案 0 :(得分:1)

同样,您可以创建一个JDialog模式,并将其父窗口设置为主JFrame,并使第二个对话框无模式,并将其父窗口设置为第一个对话框。类似的东西:

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

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

public class MultipleDialogs {
    @SuppressWarnings("serial")
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            final JFrame mainFrame = new JFrame("Main JFrame");
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mainFrame.setPreferredSize(new Dimension(400, 300));

            JPanel panel = new JPanel();
            panel.add(new JButton(new AbstractAction("Two Dialogs") {

                @Override
                public void actionPerformed(ActionEvent e) {
                    JDialog dialog1 = new JDialog(mainFrame, "Dialog 1 -- modal", ModalityType.APPLICATION_MODAL);
                    dialog1.setPreferredSize(new Dimension(200, 100));
                    dialog1.pack();
                    dialog1.setLocationByPlatform(true);

                    JDialog dialog2 = new JDialog(dialog1, "Dialog 2 -- nonmodal", ModalityType.MODELESS);
                    dialog2.setPreferredSize(new Dimension(200, 100));
                    dialog2.pack();
                    dialog2.setLocationByPlatform(true);
                    dialog2.setVisible(true);

                    dialog1.setVisible(true);
                }
            }));

            mainFrame.add(panel);
            mainFrame.pack();
            mainFrame.setLocationRelativeTo(null);
            mainFrame.setVisible(true);
        });
    }
}

确保在显示第一个对话框后将模态对话框设置为

答案 1 :(得分:0)

我找到了我要找的东西。基本上我将对话框模态设置为false,并在启动时将父帧设置为禁用。然后我继续计算打开的对话框的数量,当所有对话框都关闭时,我重新启用它。