这可能是一个基本问题,但我坚持使用。
我想了解一下当我从按钮点击事件启动新线程(runnable)时GUI被阻止的原因?我该如何克服这个问题?我做错了什么?
下面的代码在单击时会启动一个新线程,但是我想在单击该按钮时更改文本框的背景颜色但是我无法做到这一点,主要的ui也没有响应,而该线程是运行,我相信我正在通过启动一个新线程正确实现它,以便不阻止主ui,但我一定错过了一些东西,因为这显然是不希望的行为。
代码:
private void startButtonEvent(ActionEvent evt) {
ntmStatusText.setBackground(Color.green);// textbackground I want to change
//Start Ntm Thread
Thread thread = new Thread(new NtmThread());
thread.start();
while(thread.isAlive()){
System.out.println("thread still working");
}
System.out.println("thread stopped");
}
如何在运行线程时阻止我的Ui无响应?
答案 0 :(得分:3)
while(thread.isAlive()){
是一种阻塞方法,它会停止事件调度线程,直到Thread.isAlive
变为false,这会阻止它处理添加到事件队列中的新事件,包括绘制请求
这是因为Swing是一个单线程环境,这意味着有一个线程负责处理进入程序的所有事件。这由Event Dispatching Thread处理。
所有用户生成的事件都在EDT中管理(即,actionPerformed
方法,在EDT的上下文中调用)
您可以向NtmThread
提供回电功能,或考虑使用SwingWorker
并将PropertyChanegListener
附加到state
的监视器上并检查SwingWorker
的状态已更改为DONE
有关详细信息,请参阅Worker Threads and SwingWorker
答案 1 :(得分:0)
您已经创建了一个新线程,但是您正在使用当前线程来检查创建的线程是否处于活动状态while(thread.isAlive()){
。
所以当前的线程永远不会出现在循环中,直到你创建的线程没有停止
而你当前的线程负责完成所有的gui工作,但是你让它卡住了,这就是你的GUI被阻止的原因。