当前位置:  开发笔记 > 编程语言 > 正文

Java:必须在EDT线程中初始化GUI?

如何解决《Java:必须在EDT线程中初始化GUI?》经验,为你挑选了1个好方法。

我是杰森.我对Substance的外观有一点问题(https://substance.dev.java.net/).

我的问题更为笼统.我已经编写了GUI并且工作正常,但是当我使用Substance Look-and-feel时,它需要在EDT线程(事件调度线程或其他东西)中进行所有GUI初始化.

现在我正在使用com.sun.java.swing.plaf.windows.WindowsLookAndFeel(不确定我是否拼写正确)并且它不需要任何此类内容.

所以我通过调用SwingUtilities.invokeLater()将主要初始化放入EDT.这使它工作.但是,该程序在执行期间还会生成其他几个窗口.现在我的代码如下:

SomeNewWindow window = new SomeNewWindow();
// ... some bs emitted
window.doStuff();

这段代码工作正常,因为在调用window.doStuff()时,它已经初始化了.但是Substance要求我做这样的事情:

SwingUtilities.invokeLater(new Runnable(){
public void run(){
SomeNewWindow window = new SomeNewWindow();
}});
// ... bs emitted
window.doStuff();

这里它有时会抛出NullPointerException,因为窗口没有被时间窗口初始化.调用了doStuff().我不能将window.doStuff()放入EDT线程,因为它通常需要几秒钟才能返回并挂起GUI.

我在调用EDT线程后尝试放入Thread.sleep(1000),因为它可能已经初始化了.但这似乎很尴尬.我只需要一种方法让主线程在SomeNewWindow初始化返回时"知道",这样它就可以继续而不必担心NullPointerException.

提前致谢.



1> Paul Tomblin..:

你可以从你的invokeLater切换到invokeAndWait,这将等到创建窗口.这有点俗气,但没有睡觉那么糟糕.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有