gpt4 book ai didi

java - 带 Swing 进度条的多线程

转载 作者:行者123 更新时间:2023-12-02 04:38:07 26 4
gpt4 key购买 nike

我已经没有办法让我的进度条在执行 RMI 连接期间做出响应,所以我决定向您寻求帮助。

代码如下:

Thread performLogin = new Thread(new Runnable()
{

@Override
public void run()
{
LoginResult = TryLogin();
}
});

performLogin.start();
WaiterFrame.setVisible(true);
SetProgressDialog();

try
{
performLogin.join();
}
catch(InterruptedException exc)
{
System.err.println(exc.getLocalizedMessage());
}

if (LoginResult)
{ ... }


WaiterFrame.setVisible(false);
this.dispose();

进度条无响应 - 在执行 PerformLogin 线程时未按应有的方式显示动画。我也尝试在另一个线程上运行进度条框架,但结果是相同的(以及使用 Eventqueue.invokelater())。

最佳答案

可能的原因是 performLogin.join(); 阻塞了事件调度线程,导致 UI 无响应。

使用 Swing(以及大多数 GUI 框架)需要记住两件事;

  1. 它是单线程的,这意味着如果您出于任何原因阻止 EDT,它将无法再处理新事件或执行重绘
  2. 它不是线程安全的,因此您永远不应该从 EDT 上下文之外修改 UI 的状态。

您可以使用 SwingWorker,它允许您在后台线程中运行长时间运行的进程,但提供了多种机制,您可以通过这些机制安全地将更新发送回 EDT。

参见Worker Threads and SwingWorker了解更多详情和 Issues with SwingWorker and JProgressBar举个例子

关于java - 带 Swing 进度条的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518368/

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