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

Java:GUI必须在EDT线程中初始化?,java,multithreading,user-interface,swing,look-and-feel,Java,Multithreading,User Interface,Swing,Look And Feel,我是杰森。我对物质的外观有点问题() 我的问题更一般。我已经编写了GUI,它工作得很好,但当我使用Substance外观时,它要求所有GUI初始化都在EDT线程(事件调度线程或其他)中进行 现在我正在使用com.sun.java.swing.plaf.windows.WindowsLookAndFeel(不确定我是否拼写正确),它不需要任何类似的东西 因此,我通过调用SwingUtilities.invokeLater()将主初始化放入EDT。这使它起了作用。但是,该程序在执行过程中还会生成其他

我是杰森。我对物质的外观有点问题()

我的问题更一般。我已经编写了GUI,它工作得很好,但当我使用Substance外观时,它要求所有GUI初始化都在EDT线程(事件调度线程或其他)中进行

现在我正在使用com.sun.java.swing.plaf.windows.WindowsLookAndFeel(不确定我是否拼写正确),它不需要任何类似的东西

因此,我通过调用SwingUtilities.invokeLater()将主初始化放入EDT。这使它起了作用。但是,该程序在执行过程中还会生成其他几个窗口。现在我有这样的代码:

SomeNewWindow window = new SomeNewWindow();
// ... some bs emitted
window.doStuff();
这段代码运行良好,因为在调用time window.doStuff()时,它已经初始化。但实质要求我这样做:

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


提前感谢。

我认为实现这一点的标准方法是将您的EDT作为“基本线程”,从中启动其他工作线程来执行任务

另一种方法是使用初始化器在完成时可以设置的
volatile
标志,以便其他线程可以在循环中检查它,并在设置标志后对新窗口进行操作。

Egwor建议改用。显然,这会简化情况


这是我的工作

基本上,在run()中,锁定锁,构造一些新窗口并发出条件信号(并解锁锁)。
“同时”,在另一个线程中,做你的另一个“b”,锁定锁;如果窗口为空,则等待条件变量的值();开锁;window.doStuff()

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

有什么原因不能将doStuff()调用移到invokeLater回调中

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

如果以上不可能,我会使用
invokeAndWait()
,而不是像Paul Tomblin已经建议的那样使用
invokeLater()

我认为倒计时锁可能更好,不是吗?也许吧。我不知道倒计时闩锁是什么:)和否,因为window.doStuff通常需要几秒钟或几分钟。我试着这样做,此时窗口变得透明。