Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing中模式对话框的正确父级_Java_Macos_Swing_Dialog_Modal Dialog - Fatal编程技术网

Java Swing中模式对话框的正确父级

Java Swing中模式对话框的正确父级,java,macos,swing,dialog,modal-dialog,Java,Macos,Swing,Dialog,Modal Dialog,我在Java 8u151/8u152中遇到了一个模式对话框错误,这在8u112中不是问题,我不确定我是否做了一些固有的错误,或者这是一个JRE错误。据我所知,这只会影响Mac操作系统(我运行的是OS 10.12.6),所以尽管我的问题不是针对Mac的,但如果你不是Mac用户,你将无法观察到这个错误 我创建了一个模态对话框,其中主JFrame作为其父对象。然后,我创建了一个新的模态对话框,该对话框由对话框1创建。将dialog#2的父对象也设置为主JFrame是否错误?还是一定是对话2 问另一种方

我在Java 8u151/8u152中遇到了一个模式对话框错误,这在8u112中不是问题,我不确定我是否做了一些固有的错误,或者这是一个JRE错误。据我所知,这只会影响Mac操作系统(我运行的是OS 10.12.6),所以尽管我的问题不是针对Mac的,但如果你不是Mac用户,你将无法观察到这个错误

我创建了一个模态对话框,其中主JFrame作为其父对象。然后,我创建了一个新的模态对话框,该对话框由对话框1创建。将dialog#2的父对象也设置为主JFrame是否错误?还是一定是对话2

问另一种方式:如果两个对话框共享相同的父对象(主JFrame),但对话框2是最后创建的,那么期望对话框2位于顶部是合理的,还是行为未定义

有了8u112,对话#2聚焦在顶部。有了8u151,对话#2就聚焦了,但落后了。如果我点击任何一个对话框,对话框#2都会抓住焦点,并且在大多数情况下都表现得很好。然而,有时dialog#2会保持在其他应用程序的顶部(我相信如果我单击主窗口,然后返回模式对话框,就会发生这种情况……这部分肯定是一个bug)

注意:对于Java8U121到(我认为)8u144,模式对话框还有一些问题,这些问题应该在8u152中得到修复(我在几个月前记录了一个错误报告并检查了早期的access构建,而当时的情况确实得到了修复)

一些示例代码说明了我正在做的事情:

import javax.swing.*;
import java.awt.*;

public class Main extends JFrame {
    MyPanel panel;

    public Main() {
        setTitle("This is a frame");
        setSize(300, 200);
        panel = new MyPanel(this);
        add(panel);

        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            Main frame = new Main();
            frame.pack();
            frame.setVisible(true);
        });
    }

    private static class MyPanel extends JPanel {

        int dialogCounter = 1;
        final JFrame theParent;

        public MyPanel(JFrame parent) {
            super();
            theParent = parent;
            setPreferredSize(new Dimension(300, 200));
            JButton button = new JButton("Press the button");
            button.addActionListener(e -> showDialog(theParent));

            add(button);
        }

        private void showDialog(Frame parent) {
            JDialog dialog = new JDialog(parent, "This is dialog " + dialogCounter, true);
            setupDialog(dialog);
        }

        private void setupDialog(JDialog dialog) {
            JPanel dialogPanel = new JPanel();
            dialogPanel.setPreferredSize(new Dimension(300, 200));
            dialogPanel.add(new JLabel("Current dialog count: " + dialogCounter++));
            JButton button = new JButton("Open a new modal dialog");
            button.addActionListener(e -> showDialog(theParent));
            dialogPanel.add(button);
            dialog.add(dialogPanel);
            dialog.pack();
            dialog.setVisible(true);
        }
    }
}

这是8u151中引入的错误。它已经被修复,应该被后传到下一个OpenJDK 8更新版本。 以下是您可以使用的解决方法:

    dialog.addWindowListener(new WindowAdapter() {
        @Override
        public void windowOpened(WindowEvent e) {
            dialog.removeWindowListener(this);
            dialog.toFront();
        }
    });

如果dialog 2是从dialog 1创建的,我会自动假设dialog 1是dialog 2的父级,这可能有点复杂,但您可以使用SwingUtilities获取组件的窗口祖先,然后需要instanceof来确定它是帧还是对话框,但至少您不需要传递框架引用,关于Oracle是否有此缺陷ID?我们一直在等待8u121中引入的Mac OS对话框错误修复,现在已经等了好几个月了,如果能知道什么时候能够更新Java版本,那就太好了。它看起来仍然存在于8u162(早期访问)和9.0.1中。对于任何感兴趣的人,我记录了一个错误报告,因此它现在有错误ID JDK-8190522。