问题标签 [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 投票
3 回答
4234 浏览

java - 如何将 SwingWorker 的发布委托给其他方法

我的“问题”可以用以下方式描述。假设我们有一个密集的进程,我们希望在后台运行并让它更新一个 Swing JProgress 栏。解决方案很简单:

现在假设我有各种需要很长时间的方法。例如,我们有一个从服务器下载文件的方法。或者另一个上传到服务器的。或者真的什么。将发布方法委托给这些方法以便它们可以适当地更新 GUI 的正确方法是什么?

到目前为止我发现的是这个(假设方法“aMethod”位于其他一些包中):

它有效,但我知道它缺少一些东西。有什么想法吗?

0 投票
2 回答
163 浏览

java - 如果将大量对象传递给我的 SwingWorker.process() 方法怎么办?

我刚刚发现了一个有趣的情况。假设你有一些 SwingWorker (我让这个有点让人想起我自己的):

如果在后台完成的工作很重要,那么事情就会很好 -process()用相对较少的对象列表调用并且一切都很愉快。

问题是,如果在后台完成的工作由于某种原因突然变得微不足道,process()会收到一个巨大的对象列表(例如,我见过 1,000,000 个),并且当您处理每个对象时,您已经在 Event Dispatch 上花费了 20 秒线程,正是 SwingWorker 旨在避免的。

如果不清楚,对我来说,这两者都发生在同一个 SwingWorker 类上——这取决于输入数据和调用者想要的处理类型。

有没有合适的方法来处理这个?显然,我可以故意延迟或让出后台处理线程,以便每次可能有更少的线程到达,但这对我来说并不是正确的解决方案。

0 投票
2 回答
1667 浏览

java - 为什么在 SwingWorker 线程运行时我的 GUI 没有响应?

我有一个带有 IOBound 任务的 SwingWorker 线程,它在运行时完全锁定了接口。将正常工作负载换成计数器循环具有相同的结果。SwingWorker 看起来基本上是这样的:

}

启动它的代码位于扩展 JFrame 的类中:

这是 StatusFrame 有趣的部分:

}

就我所见,所有“长时间运行”的东西都由工人处理,所有接触到 EDT 上的 GUI 的东西。我是否在某个地方纠结过,还是我对 SwingWorker 期望过高?

0 投票
1 回答
876 浏览

java - 从 SwingWorker 执行 SwingWorker - 等到第一个停止

我正在尝试从另一个 SwingWorker (MainWorker) 执行 SwingWorker (SubWorker),然后我希望 MainWorker 等待 SubWorker 完成。同时,MainWorker 应根据 SubWorker 的属性变化进行自我更新。

问题是 SubWorker 的 doInBackground 方法在 MainWorker 完成之前不会被调用,而 MainWorker 正在等待 SubWorker 完成。

如何让 SubWorker 与 MainWorker 的活动并行运行?

0 投票
3 回答
2042 浏览

java - 如何使这个 SwingWorker 代码可测试

考虑这段代码:

url是一个 JTextField,'creator' 是一个用于写入文件的注入接口(因此该部分正在测试中)。写入文件的位置是故意硬编码的,因为这只是一个示例。并且 java.util.logging 仅用于避免外部依赖。

您将如何将其分块以使其可单元测试(包括在需要时放弃 SwingWorker,但随后替换其功能,至少如此处使用的那样)。

在我看来,doInBackground 基本上没问题。基本机制是创建一个作家并关闭它,这几乎太简单而无法测试,而真正的工作正在测试中。但是, done 方法存在引用问题,包括它与父类的 actionPerformed 方法耦合以及协调按钮的启用和禁用。

但是,将其分开并不明显。注入某种 SwingWorkerFactory 使得捕获 GUI 字段变得更加难以维护(很难看出这将如何改进设计)。JOpitonPane 和 Desktop 具有 Singleton 的所有“优点”,并且异常处理使得无法轻松包装 get。

那么什么是测试这段代码的好解决方案呢?

0 投票
1 回答
863 浏览

java - 这个 SwingWorker 是否没有重用 ThreadPoolExecutor 中的线程?

作为我最后一年项目的一部分,我开发了一个桌面应用程序,如果存在这样的东西,它就属于“图形 IDE”的类别。我已经实现了Jessy James Garrett Visual Vocabulary for Information Architecture and Interaction Design的一个小子集,因此用户可以绘制表示用户在 web 应用程序中的体验的图表(换句话说,有向图),将 HTML 模板分配给页面并编写一旦编译应用程序并且用户单击相应的超链接,将执行连接器/转换的一些代码。

(我不能发布多个超链接,但我指的是页面和连接器,例如 JJG 的视觉词汇中描述的用户体验元素)

所以我使用不同的 SwingWorkers 来生成一组 C++ 源文件,其中图表被翻译成。查看日志,我发现我的应用程序总是在创建新线程,而不是重用它们。

我所有的工人都做同样的两件事:

  1. 使用 Freemarker 模板引擎生成一对 C++ 源文件和头文件。

  2. 通过发布过程机制向用户发送消息,EDT以告知用户事情进展如何。

我相信我已经对SwingWorkers 进行了仔细的编码。我特别担心 FileWriter 实例没有按预期关闭,但我看不出ThreadPoolExecutor没有重用它之前创建的线程的原因。

魔法发生在ConnectorGenerator. BaseWorker扩展SwingWorker<V,T>并仅保存与组件通信以向用户显示消息的行为。

以及该Transition.build(String)方法,包括一个丑陋的 try-catch-finally 块:

有人看到或知道我可能遗漏的东西吗?

0 投票
2 回答
2206 浏览

java - Java GUI 线程 - SwingWorker

我有一个关于 SwingWorker 和 Java GUI 的问题。

我有几个处理信息的类,我们可以称它们Foo1为 、Foo2Foo3。此处理可能需要很长时间。

这些都是 的子类Foo,但是Foo本身并不直接调用(这些Foo[x]类使用从 继承的方法Foo。为了让 EDT 自由绘制进度条,SwingWorker在保持我的对象层次结构时最好使用什么方法?是否可以有包装类,比如Foo1Worker extends SwingWorkerand 有它的doInBackground()调用Foo1.myProcessMethod()吗?即使Foo1不扩展SwingWorker,这仍然会像我期望的那样工作吗?

Foo[x]编辑:为了澄清我的问题,即使 SwingWorkers 已经是子类,我该如何制作它们?

0 投票
1 回答
1104 浏览

java - SwingUtilities.invokeLater()

我如何看待 SwingUtilities.invokeLater() 在任何 Swing 应用程序中的重要性。请给出一些代码示例。

0 投票
2 回答
2291 浏览

java - java swing工作线程等待EDT

我有一个工作线程应该等待 EDT 在继续执行之前更新 GUI。我已经使用发布方法告诉 EDT 进行更改。我怎样才能让工人等待改变发生?

0 投票
3 回答
3052 浏览

java - 有没有办法不止一次地启动和停止一个 SwingWorker..?

我有一个开始和停止按钮。有人告诉我必须使用 SwingWorker。我现在的代码工作正常。我开始它,我停止它。但是如果我想重新开始呢..?我正在阅读 doinBackground 方法只会执行一次。有没有办法再次将其关闭..??

现在我无法创建该 Swing Worker 的新实例,因为在我的 Swing Worker 中,我有一个 while 循环说 while(isSet) 当我单击开始按钮时设置为 True,当我单击停止时设置为 False按钮。

有没有解决的办法..??

谢谢