gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:16:09 25 4
gpt4 key购买 nike

这可能是一个基本问题,但却是我一直坚持的问题。

我想更多地了解为什么当我从按钮单击事件启动新线程(可运行)时 GUI 被阻塞?我该如何克服呢?我做错了什么?

下面的代码在单击时启动一个新线程,但是我想在单击该按钮时更改文本框的背景颜色但我无法做到这一点,而且主 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 是单线程环境,这意味着只有一个线程负责处理进入程序的所有事件。这由事件调度线程处理。

所有用户生成的事件都在 EDT 中进行管理(也就是说,您的 actionPerformed 方法在 EDT 的上下文中被调用)

Concurrency in Swing

然后您要么为您的 NtmThread 提供回调功能,要么考虑使用 SwingWorker 并为其附加一个 PropertyChanegListener 作为监视器属性 state 并检查 SwingWorker 的状态是否已更改为 DONE

参见 Worker Threads and SwingWorker了解更多详情

例如:How to use jProgress bar for ProcessBuilder process?

关于java - Gui 在从按钮单击事件启动线程时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com