我是杰森.我对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.
提前致谢.
你可以从你的invokeLater切换到invokeAndWait,这将等到创建窗口.这有点俗气,但没有睡觉那么糟糕.