注意:我工作了很多时间并研究了google和stackoverflow,但我找不到答案。
我用线。sleep(),它冻结了所有其他JDialog、JFrame和线程。
我的示例代码:
public Guitest()
{
setSize(300,300);
// create a JDialog that make guitest wait
MyDialog dlg = new MyDialog();
dlg.setSize(100,100);
dlg.setVisible(true);
while(dlg.isWait())
{
try
{
Thread.sleep(1000);
} catch (InterruptedException ex)
{
Logger.getLogger(Guitest.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("waiting mydialog");
}
}
class MyDialog extends JDialog
{
boolean wait = true;
JButton btn = new JButton("OK");
public MyDialog()
{
setSize(50,50);
btn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
wait=false;
}
});
add(btn);
}
public boolean isWait()
{
return wait;
}
}
在这种情况下,JDialog无法正确显示:
inccorect出现jdialog
但它必须符合这一点:
true出现jdialog
我怎样才能解决这个问题。我想让主线程等待另一个线程。有人可以纠正我的示例代码,或者在这种情况下共享示例代码。
嗯,看起来你只有一个线程在运行。首先,我们绘制JDialog,然后,由于wait标志,您将Hibernate主线程。例如,你不能执行你的按钮动作监听器,因此你不能唤醒你的线程。
希望有助于理解。
线程。睡眠()
只是让当前线程Hibernate(即停止它做任何事情,例如重绘、处理点击等),在您的例子中是UI线程
。
您需要使用辅助线程。任何需要完成的主要工作都需要在它自己的线程中完成,这就是你想要睡眠的线程。它目前与UI组件一起运行,这就是为什么你会看到它们冻结的原因。
一个很好的参考是摆动
并发的留档http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
以下内容也可能有用:
http://java.sun.com/developer/technicalArticles/Threads/swing/http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html