java swing中Modal Window顶部的模态窗口?

时间:2015-04-16 10:45:03

标签: java swing modal-dialog jframe jdialog

我有以下问题:

我有一个填充整个屏幕的主应用程序窗口(JFrame) 单击按钮时,会出现一个较小的窗口,让用户输入一些数据。当用户这样做时,主窗口既不应该跳到它前面,也不应该允许交互 解决方案:打开一个模态JDialog。让我们称之为Dialog 1.
但是当单击此对话框中的按钮时,应该弹出一个新窗口(是/否对话框)..再次,需要在已经模态的JDialog对话框上执行模态1.尝试这样做,第二个对话在第一个后面不断消失。
我尝试将Dialog 1作为JFrame,但当然,我放松了"模态"位。强制Dialog 1保持不动仍然可以保持主窗口的按钮可点击 我错过了什么?如何在另一个模态摆动窗口上放置一个模态摆动窗口?

编辑: 一个非实际工作版本的最小例子:

开放的主要课程:

public class MainWin extends JFrame {

public MainWin(){
    this.setSize(800,800);
    JButton b = new JButton("click hehe");
    this.getContentPane().add(b);
    b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            new Dia1(MainWin.this);
        }
    });
    this.setVisible(true);
}

}

主窗口:

 public class MainWin extends JFrame {

public MainWin(){
    this.setSize(800,800);
    JButton b = new JButton("click hehe");
    this.getContentPane().add(b);
    b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            new Dia1(MainWin.this);
        }
    });
    this.setVisible(true);
}
}

第一个对话:

public class Dia1 extends JDialog {


public Dia1(final JFrame parent){
    super(parent, true);
    this.setSize(400, 400);
    JButton b = new JButton("click hehe");
    this.getContentPane().add(b);
    this.setVisible(true);
    b.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            new Dia2(parent);
        }
    });
}
}

第二个对话:

public class Dia2 extends JDialog {


public Dia2(JFrame parent){
    super(parent, true);
    this.setSize(200, 200);
    JButton b = new JButton("click hehe");
    this.getContentPane().add(b);
    this.setVisible(true);
}

}
PS:我刚刚意识到:对话框2没有隐藏,因为我怀疑......它根本就不存在。很可能是因为父窗口被阻止了模态对话框?

1 个答案:

答案 0 :(得分:2)

这是一个按照广告宣传的方式MCVE。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ModalOverModal {

    private JComponent ui = null;

    ModalOverModal() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new GridLayout());
        ui.setBorder(new EmptyBorder(40,40,40,40));

        final JButton b1 = new JButton("Open Modal Dialog");
        b1.setMargin(new Insets(40, 200, 40, 200));
        ui.add(b1);

        final JButton b2 = new JButton("Open 2nd Modal Dialog");

        ActionListener al1 = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(b1, b2);
            }
        };
        b1.addActionListener(al1);

        ActionListener al2 = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(b2, "Close Me!");
            }
        };
        b2.addActionListener(al2);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                ModalOverModal o = new ModalOverModal();

                JFrame f = new JFrame("Modal over Modal");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}