在模态JDialog上忽略鼠标单击

时间:2014-06-24 13:03:49

标签: java swing modal-dialog jdialog

我无法理解模态JDialog的行为。

当对话框设置为visible时,所有工作正常,直到用户单击用于启动它的父JFrame为止。尽管对话框仍按预期保持在顶部,但忽略了JDialog上所有后续鼠标单击。 JDialog中的表单项仍然可以填写,但前提是您使用tab导航。这是正常的还是我错过了一些明显的东西?

以下是一个说明行为的简单示例:

import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.EventQueue;
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.JTextField;

public class TestApp {

private JFrame frame;

    public TestApp() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton btnRun = new JButton("run");
        btnRun.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                JDialog dialog = getChildDialog();
                dialog.setModalityType(ModalityType.APPLICATION_MODAL);
                dialog.setVisible(true);
            }

        });
        frame.getContentPane().add(btnRun, BorderLayout.CENTER);
    }

    public JDialog getChildDialog() {

        JDialog dialog = new JDialog();
        dialog.setModalityType(ModalityType.APPLICATION_MODAL);
        dialog.setBounds(100, 100, 450, 300);
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(new JTextField(), BorderLayout.CENTER);
        panel.add(new JTextField(), BorderLayout.NORTH);
        panel.add(new JTextField(), BorderLayout.SOUTH);
        panel.add(new JLabel("Blah"), BorderLayout.EAST);
        panel.add(new JLabel("Blah"), BorderLayout.WEST);
        dialog.getContentPane().setLayout(new BorderLayout());
        dialog.getContentPane().add(panel, BorderLayout.CENTER);
        return dialog;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TestApp window = new TestApp();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

1 个答案:

答案 0 :(得分:0)

感谢您的反馈。我认为这肯定是我使用的JVM中的一个错误(OpenJDK 2.4.7 7u55-2.4.7-1ubuntu1)。

我只是在Windows Java 7 JVM上运行相同的代码,并且不会获得相同的行为。我将提交错误报告。