Swing JDialog的bug?

时间:2011-03-26 14:35:54

标签: java swing jdialog

我正在尝试通过扩展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中尝试了相同的代码,它运行正常,可能是我的问题??

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

以上所有解决方案都很棒,我在展示JDialog时也有非常令人不安的时刻。

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

JDialog

执行相同的操作

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