java – 如何在另一个模态JDialog之上创建一个模态的JDialog

前端之家收集整理的这篇文章主要介绍了java – 如何在另一个模态JDialog之上创建一个模态的JDialog前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个模式设置对话框是一个JDialog.在这个设置窗口中,我将一些组件(包括一个按钮)放置到另一个模式设置对话框,该对话框也是一个JDialog.我使他们成为JDialogs,因为这是我知道进行模态对话的唯一方法.

问题是这样的:当我创建主设置对话框时,我必须构建JDialog,无需父帧或父帧.由于我的主窗口是一个JFrame,我可以把它传递给主设置对话框的构造函数.但是当我想创建第二个模态设置对话框时,应该将主设置对话框作为父项,我找不到一个方法获取JDialog的(J)框架.我确实希望通过这个主设置对话框作为父级,以便第二个设置对话框显示在它上面.让我们假设第二个设置对话框没有用于传递位置的构造函数,只是JDialog的构造函数.

有没有办法得到JDialog的(J)框架?
我的设置是否存在设计缺陷,我应该用这些设置对话框中的其他内容吗? (如果是这样,我应该如何使这些替代设置对话框模态?)

感谢您的帮助,
埃里克

更新:
感谢大家的答案.他们让我明白,显然JDalog的所有者并不是绝对必要的.我认为这是对话框需要关闭所有者,直到对话框关闭,但显然模式是独立于所有者.我也注意到,即使是拥有者,对话框仍然不是所有者的中心,所以现在我的代码就像:

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

这也允许模态对话框中的模态对话框.

感谢你的帮助!

解决方法

不确定你有什么问题,但这里是一个例子,你可以有多个模态对话框:
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();
            }
        });
    }
}

猜你在找的Java相关文章