JDialog 不可见
Posted
技术标签:
【中文标题】JDialog 不可见【英文标题】:JDialog is not visible 【发布时间】:2013-12-07 17:04:55 【问题描述】:我有一个自定义JDialog
的问题,它是由主框架在其自己的线程中创建的。
有时JDialog
是不可见的,但它的控件是可点击的(如果您知道它们的位置)。 Oracle Java 1.7 上不会出现此问题,但 Oracle Java 1.6 上肯定会出现此问题(见于 1.6.0_37 和 1.6.0_45)。
我这样创建对话框:
class MyDialog extends Jdialog()
public MyDialog(JFrame frame, boolean modal)
super(frame, modal);
[...]
在我的大型机中:
MyDialog dialog = new MyDialog(myMainFrame,true);
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
dialog.setVisible(true);
预期的行为是阻止大型机的MouseEvents
之类的事件并覆盖它。这在 Java 1.7 上完美运行。
所以我的问题是,在创建 JDialogs
时是否有任何特殊的事情需要记住,比如仅在父框架(所有者)可见之后创建它,或者它可能是使用的 Java JRE 的已知错误?我已经检查了 Oracle here 的错误修复日志,但没有成功。
【问题讨论】:
没有理由像@subash 建议的那样调用repaint()
或revalidate
。你的问题听起来是断断续续的,对我来说这是一个 Swing 线程问题。您是否注意在 EDT 上进行所有 Swing 调用?并从 EDT 中调用长时间运行的代码?如果您可以在此处发布编译、运行和重现您的问题的简短代码,最好是sscce。
你是对的,SSCCE 会更好,但我的问题是参与一个大型代码项目,所以很遗憾,sccce 不会重现我的问题。我认为@Durandal 提示将我引向正确的方向,因为这似乎是线程的问题。这可以解释为什么它并不总是发生,而只是有时发生。 JAVA 1.6 / 1.7 问题可能与不同的设计有关。感谢您的帮助!
【参考方案1】:
“我的自定义 JDialog 有问题,它是由主框架在自己的线程中创建的”
如果这是真的,那就是问题所在。
您不应该在除事件调度线程之外的任何其他线程上创建 Swing 对象的实例,尤其是 JComponent。 Swing 不是完全线程安全的,当您不确定自己是否在 EDT 上时,请使用 SwingUtilities.invokeAndWait()/invokeLater() 执行 GUI 相关代码。
【讨论】:
以上是关于JDialog 不可见的主要内容,如果未能解决你的问题,请参考以下文章
如何设置可见以隐藏设置为可见的 jDialog(在 if 条件内)显示(在 if 循环之外)?
来自命令行的 javax.swing.JDialog.setAutoRequestFocus 的 Java NoSuchMethodError