3

目前我总是创建一个SwingWorker来做我的实际工作,另一个通过PipedReader.

我很想将两者结合起来,但在我的情况下,我只是看不到一个简单的方法。

鉴于我:

  1. 有一个可以工作的预制对象(converter在这种情况下)
  2. 想要定期converter向 GUI 显示有关 的进度的更新
  3. converter完成任务并返回时接收对象。

没有两个 SwingWorker 有没有办法做到这一点?

编辑:请注意,converter扩展SwingWorker不是一种选择。

编辑2:回应下面的评论。这是一个更大的 GUI 应用程序的一部分,处理大量数据(以 txt 的形式)并通知用户什么是错误的,或者什么已经决定。

示例代码(纯说明性,未使用):

//SwingWorker 1
@Override
protected Void doInBackground() {

   outputWorker.useInStream(new PipedReader(outStream));
   outputWorker.execute();
   converter.usePipedWriter(outStream);
   Output object2=converter.Convert(object1);

}

//SwingWorker 2
@Override
protected Void doInBackground() {

   while(inStream.hasNext()) {
      publish(inStream.next());
   }
}
4

2 回答 2

2

如果使用一两个SwingWorker,则不是您问题的答案,我想让这些事情复杂化...

@user1291492 处理 30 mb 文本文件

于 2012-04-20T16:48:08.447 回答
1

如果您使用的是 JDK7,则可以考虑使用SecondaryLoop而不是将多个 SwingWorker 实例链接在一起。

SecondaryLoop 本质上允许您等待后台线程(或一系列线程)完成而不阻塞 EDT,类似于 SwingWorker。它可能不适合在任何情况下替代 SwingWorker,但是根据您对问题的描述,这听起来像是您可以使用的东西。

有关此主题的更多讨论,请查看相关问题“ SecondaryLoop 代替 SwingWorker?

于 2012-04-23T17:00:17.683 回答