关注mac osx上java7模式对话框的问题

Lui*_*ves 8 java macos applet swing modal-dialog

我一直在验证在mac osx的applet上运行的swing应用程序.

在此验证期间,我发现模式对话框存在以下问题:

  1. 当一个对话框打开并且是setModal(true)时,它会阻止根窗口的内容,但如果你点击根窗口的某个地方,对话框会在它下面,但它应该保留在根窗口的顶部.
  2. 如果对话框有JTextInputField,即使单击它也不会获得焦点.

所以我创建了一个小程序来显示问题.你能帮我理解这里有什么问题吗?

package com.macosx.tests;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class DialogExample extends JApplet{

    private static final long serialVersionUID = 1L;
    private JPanel panel;
    private JButton openDialogBtn;

    private void doStart() {
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(500,500));

        openDialogBtn = new JButton("open dialog");
        openDialogBtn.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                ModalDialog dialog = new ModalDialog(panel, true);
                dialog.setVisible(true);
            }

        });
        panel.add(openDialogBtn);
        setContentPane(panel);
    }


    class ModalDialog extends JDialog {
        private static final long serialVersionUID = 1L;

        public ModalDialog(Component parent, boolean modal) {
            Dimension dimensionParentFrame = parent.getSize();
            setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width / 2, 75));

            setModal(modal);
            setModalityType(ModalityType.APPLICATION_MODAL);

            JTextField txtField = new JTextField();
            add(txtField, BorderLayout.CENTER);
        }
    }


    @Override
    public void start() {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    doStart();
                }
            });
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

使用上面的方法创建.jar文件(test.jar).完成后,创建一个包含以下内容的html文件:

<html>
<head>
<title>Dialog test Applet</title>
</head>
<body>
<applet id="DialogTestApplet" height="800" width="600"
  code="com.macosx.tests.DialogExample"
  archive="test.jar">
</applet>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

完成后,运行html文件.你会看到一个灰色背景和一个按钮的小程序.然后尝试:

  1. 单击按钮打开对话框.之后,单击灰色区域的某个位置:对话框位于浏览器窗口下方,但它应保留在顶部,对吧?
  2. 单击按钮打开对话框.之后单击对话框的文本字段并尝试编写一些内容:textdialog无法获得焦点.

那么,我在这里做错了什么?有人用Mac电脑测试一下吗?

谢谢

眼镜:

java.vendor    Oracle Corporation
java.version   1.7.0_07
os.name        Mac OS X
os.version     10.7.4

browser        firefox 15
Run Code Online (Sandbox Code Playgroud)

注意:请注意,这仅在applet在浏览器上运行且仅在mac osx上运行时才会发生.

小智 6

我发现了另一种解决方法.打开窗口时,显示一个选项窗格几毫秒并关闭它.它将焦点放在选项窗格上,然后返回到对话框,允许忽略该错误.

将此snipet代码添加到对话框构造函数中,它应该工作:

addWindowListener(new WindowAdapter(){
public void windowOpened(WindowEvent e){
    JOptionPane pane = new JOptionPane();
    final JDialog dialog = pane.createDialog("Please Wait");
    Timer timer = new Timer(50, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            dialog.dispose();
        }
    });
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以尝试不可见对话框:`final JDialog dialog = new JDialog(); dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); dialog.setUndecorated(true); dialog.setModal(true);` (2认同)

Gui*_*let 1

您应该在 ModalDialog 上放置一个“所有者”窗口。为此,您必须在 ModalDialog 构造函数中调用 super(owner),并且可以使用 检索组件的父parent窗口SwingUtilities.getWindowAncestor(parent)