Java Swing中模式对话框的正确父级
我在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构建,而当时的情况确实得到了修复) 一些示例代码说明了我正在做的事情: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 问另一种方
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。