模态窗口上的Java Swing模态窗口的顶部?(Modal Window on top of Mo

2019-10-22 17:06发布

我有以下问题:

我有一个填满整个屏幕的主应用程序窗口(JFrame的)。
当一个按钮被点击时,出现较小的窗口,以让用户输入的一些数据。 当用户这样做,在主窗口既不应该跳在前面,也不允许互动。
解决方案是:打开一个模式的JDialog。 让我们称之为该对话框1。
但点击该对话框中的按钮时,一个新的窗口(是/否的对话中)应该弹出..并再次,需要采取行动模式上已经模态的JDialog对话框1.试图做到这一点,第二对话不断消失背后的第一个。
我试图使对话框1一个JFrame,但然后,当然,我松散的“莫代尔”位。 强制对话框1留在从仍然保持在主窗口的按钮点击。
我在想什么? 我怎样才能把一个模态窗口摆OVER另一个模式摆动窗口?

编辑:一不,真正的工作版本的小例子:

开主类:

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不会隐藏,我怀疑..这是根本不存在。 最有可能的,因为从模态对话框阻塞父窗口?

Answer 1:

下面是模式工作的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);
    }
}


文章来源: Modal Window on top of Modal Window in java swing?