问题标签 [swingworker]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1511 浏览

java - 如何在不阻塞 EDT 的情况下等待 EDT 中的对象创建?

我在 Java 库中使用 API,该 API 从事件调度线程调用并要求我返回完全初始化的 UI 组件。它看起来像这样:

但我只能在从数据库加载后填充对话框,有时可能需要 10 秒。通常我会在后台线程中执行此操作,但由于此方法是从 EDT 调用的,并且由于我必须返回对话框,所以这不起作用。它是一个第三方库,所以我无法更改方法,但有什么办法可以避免阻塞 EDT?

0 投票
4 回答
3732 浏览

java - 如何报告后台任务的进度?

我有一个长时间运行的任务,它在 ExecutorService 线程池的后台执行。就此任务返回进度或中间结果而言,有哪些最佳实践?有没有提供此功能的库?

编辑:为了澄清,我说的是向其他代码报告进度,而不是向用户报告。

通常我会使用 SwingWorker,但我正在为 Grails 应用程序使用 Java/Groovy 后端,我不确定它在无头服务器环境中的行为如何,因为它具有 EDT 关系。

另一个例子是 Eclipse RCP 中的 Jobs 框架,但我需要一些与 UI 无关的东西。

0 投票
3 回答
2929 浏览

java - Java GUI 和 SwingWorker 类的多个实例

我正在使用 Java 制作 GUI(谁不是?)。我知道 Swing Worker 类可以在后台进行计算以防止 GUI 挂起,但我想知道这里是否有太多的好东西......

例如,如果这些后台线程的实例太多,是否会影响程序的性能,具体取决于计算机?一个简单但重要的问题。我将不胜感激任何意见。谢谢你的时间。

0 投票
2 回答
3052 浏览

java - 将另一个程序的输出打印到 java 文本区域

我正在使用 Java 创建一个 GUI。此 GUI 使用 ProcessBuilder 类从命令行启动程序。

关于正在启动的进程的一些信息:从命令行,它创建另一个窗口并将信息打印到所述窗口。

在我的 GUI 窗口中,我有一个文本区域,我想将所述输出重定向到该区域。我最初打算使用 SwingWorker 对象来不断检查更多输出,而不是阻止 GUI。为了测试并确保我保留了原始语法(甚至没有将 GUI 带入其中),我想我会将辅助进程窗口的输出打印到 System.out。但是,似乎有些问题,因为我可以在辅助进程的窗口中看到输出,但看不到我正在使用的终端。

代码摘录如下:

布尔运行在程序的其他地方定义,并在进程 p 退出或强制退出时设置为 false (附加问题:这是一个非常糟糕的主意吗?我觉得它可能是......)。

有没有人知道为什么当我看到它被打印到另一个窗口时我从来没有得到任何输出?最初我的反应是使用 p.getOutputStream() 但 Scanner 没有将 outputStream 作为参数。

感谢您的时间。

0 投票
1 回答
640 浏览

java - 重定向到新 url 时小程序崩溃

我正在开发一个小程序,它可以完成一些工作,然后在用户单击按钮时重定向到 URL。我正在使用 SwingWorker 来防止 GUI 被锁定。

但是当我运行小程序时,单击按钮后出现此错误:

java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer.release( Unknown Source) at java.util.concurrent.LinkedBlockingQueue.poll(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source) at java.util.concurrent.locks.ReentrantLock.unlock(Unknown Source) at java. util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

看起来小程序正在破坏自己,但工作线程仍然存在。如果我添加一个Thread.sleep(2000); 作为测试,小程序运行正常,但我认为这不是修复它的正确方法。

我做错了什么??也许我应该从主线程进行重定向?也许小程序的销毁方法应该等待工作线程完成?

Java源码:

HTML 源代码:

0 投票
3 回答
6266 浏览

java - 获得未来进展的能力目的

参考 java.util.concurrent 包和 Future 接口,我注意到(除非我弄错了)启动冗长任务和查询进度的能力只有 SwingWorker 实现类才有。

这就引出了以下问题:

有没有办法在非 GUI、非 Swing 应用程序(成像控制台应用程序)中在后台启动一个冗长的任务并允许其他线程检查进度?在我看来,没有理由将此功能仅限于 swing / GUI 应用程序。否则,在我看来,唯一可用的选项是通过 ExecutorService::submit 返回一个 Future 对象。但是,基础 Future 接口不允许监控进度。

0 投票
2 回答
1395 浏览

java - 使 GUI 更具响应性

我拥有的程序可视化物理模拟(基本上)。现在,它可以工作,但可能会变得非常迟钝,我想我知道为什么 - 在事件线程上完成了太多(读取:全部)计算。

当按下“播放”按钮时,Timer会创建一个 Swing,它会定期唤醒并调用updateTime()——到目前为止一切都很好。问题在于updateTime()迭代每个与时间相关的对象,并告诉它以适当的量(无论是实际经过的时间,还是每个滴答声的任意时间单位)将自身向前传播。这些计算以及随后的 GUI 更新都在事件分派线程上。

所以,我想尽可能多地卸载这种计算,我认为SwingWorkers 是要走的路,但我不确定如何将它们用于现有代码。我不能让现有的类扩展SwingWorker,因为它们中的许多已经扩展了其他类。

到目前为止,我最好的想法是为每个与时间相关的对象创建一个接口来实现。该接口将指定 2 个方法,calcUpdateTime()并且drawUpdateTime(). 我会将他们当前的每个updateTime()方法拆分为物理计算(进入calc_)和 GUI 更新(进入draw_)。然后我将只创建一个 SwingWorker 类,它TimeDependant在构造函数中接受一个对象,它doInBackground会调用calcUpdateTime并且done会调用drawUpdateTime. 那么我可以替换所有出现的

我想通过 SO 运行这个想法,因为它感觉不太正确,并且它希望避免重构整个项目只是为了发现我开始时有一个坏主意。MySwingWorker此外,每个刻度可能创建数十个 s 可能不是一个坏主意吗?

感谢您阅读本文。

0 投票
1 回答
1564 浏览

java - SwingWorker 必须是嵌套类吗?

我想知道是否SwingWorker必须是我的主 GUI 中的嵌套类。我宁愿让它成为一个外部类,以使 GUI 从我的任何程序逻辑中保持清晰。

我试图使SwingWorker该类成为外部类,这对于该过程很好,不幸的是我无法从 SwingWorker 类访问我的任何 GUI 字段。每当我尝试从 SwingWorker 的方法中访问一个属性(例如标签或其他任何内容)时,done()我都会得到一个 nullPointer 异常。

任何建议将不胜感激!


首先非常感谢杰夫!到目前为止工作正常,即使我无法按照您提出的第二个选项关注您。我的一项后台任务计算了某个大小(长值),因此从我的 GUI 中获取该值会很好。

您建议使用 getter 和 setter,但不幸的是我不知道如何在 SwingWorker 类中实现它们。

我试过这样:

在方法结束时调用 setter doInBackground()。不幸的是,我无法使用get()我的 GUI 中的方法。

在我的情况下,“w”的对象创建不起作用,因为构造函数需要一个 Runnable 对象。我错过了什么吗?请放轻松,这是我第一次与 SwingWorker 合作。:) 再次感谢您的帮助!

0 投票
1 回答
3940 浏览

java - 使用 SwingWorker 向 jTable 添加行并更新 GUI

我正在尝试创建一个 jTable,一旦单击按钮,一次添加一行,其中只有一个从零开始的数字,并继续添加行直到它到达第 1000000 行。我正在使用 SwingWorker 的 doInBackground,发布和处理方法来增加行计数器并添加每一行,这意味着在添加行时 gui 不会冻结。然而,当运行时,我可以看到行号在增加,但是它只添加一行并不断更改这一行,即一行被添加到表中,并且它的行号增加,所以我最终得到一行,最后有一个数量 1000000。下面是我的 SwingWorker 代码,任何 hep 将不胜感激,这个问题让我彻夜难眠!!:/

0 投票
4 回答
2339 浏览

java - 使用 Java 的 SwingWorker 使任务超时

我正在尝试SwingWorker在我的应用程序中实现一个类。有没有办法设置SwingWorker“超时”的时间长度?我在想也许会抛出一个OutOfTime我可以捕获然后处理的异常。我只是不确定如何实现它。

感谢你的帮助!