从按钮单击事件启动线程时,Gui被阻止

这可能是一个基本问题,但我坚持使用。

当我从按钮点击事件启动一个新线程(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无法响应?

while(thread.isAlive()){是一个阻塞方法,它将停止事件调度线程,直到Thread.isAlive变为false,这会阻止它处理已添加到事件队列的新事件,包括绘制请求

这是因为Swing是一个单线程环境,这意味着有一个线程负责处理进入程序的所有事件。 这由Event Dispatching Thread处理。

所有用户生成的事件都在EDT中管理(即,您在actionPerformed方法中,在EDT的上下文中调用)

Swing中的并发性

您可以为NtmThread提供回调function,或者考虑使用SwingWorker并将PropertyChanegListener附加到属性state的监视器,并检查SwingWorker的状态是否已更改为DONE

有关更多详细信息,请参阅Worker Threads和SwingWorker

举个例子: 如何使用jProgress栏进行ProcessBuilder进程?

您已经创建了一个新线程,但是您正在使用当前线程来检查创建的线程是否处于活动状态while(thread.isAlive()){
所以当前的线程永远不会出现在循环中,直到你创建的线程没有停止。
而你当前的线程负责完成所有gui工作,但是你让它卡住了,这就是你的GUI被阻止的原因。