我正在尝试通过扩展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答案 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
......无论如何,这是我自己的经历