1

我正在尝试通过扩展 JDialog 类来创建自己的对话框,这是我用来启动的代码:

import javax.swing.JDialog;

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

    public ColorManager(){
        super();
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }
}

当我尝试运行代码时,它工作正常,但出现以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE

我读到有问题WINDOWS_EXIT或类似的东西,但我传递的参数应该可以完成这项工作。更奇怪的是,当我更改我的类以使其包含一个JDialog字段而不是扩展它时,它似乎工作得很好。我让一个朋友在他的电脑上测试,代码没有抛出异常,他使用的是 jre 版本 1.6.022,我使用的是 1.6.022,我们都使用 64 位。

所以我做错了什么?或者这是JRE中的一个错误?

编辑:忘了提,我正在使用 eclipse
Edit2:我在 Netbeans 中尝试了相同的代码,它工作正常,我的问题可能是什么?

4

2 回答 2

2

您在构造函数中调用的所有方法都应在 EDT 线程上调用。不建议在构造函数中执行此操作,但如果您坚持要确保它在 Swing (EDT) 线程上运行,例如:

import javax.swing.JDialog;

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

    public ColorManager(){
        super();
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                this.pack();
                this.setVisible(true);
             }
         });
    }
}

IMO 完成它的最佳方法是将其移动到单独的方法中,然后在创建ColorManager实例后调用它。

使用 Swing 时,您应该始终遵守 Swing 线程规则。更多信息可以在

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

于 2011-03-26T17:06:25.780 回答
-1

以上所有解决方案都很棒,我也有非常不安的时刻显示JDialog.

在 NETBEAN 8.2 上,只需左键单击JFrame并选择属性,然后设置defaultCloseOperation属性...通常是列表中的第一个,

做同样的事情JDialog

...无论如何,这是我自己的经历

于 2018-03-04T15:33:23.427 回答