Java GUI线程 – SwingWorker

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

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

这些都是Foo子类,但是Foo不是直接调用的( Foo[x]类使用从Fooinheritance的方法。为了保持EDT自由绘制进度条,在保持时使用SwingWorker的最佳方法是什么我的对象层次结构?是否有可能让包装类如Foo1Worker extends SwingWorker并使其doInBackground()调用Foo1.myProcessMethod() ?即使Foo1没有扩展SwingWorker ,这仍然可以按照我的预期工作吗?

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

我认为答案关键取决于Foo子类管理的数据类型。 如果结果是同类的,只需扩展SwingWorker并相应地实例化具体的子类:

 class Whatever {} abstract class AbstractFoo extends SwingWorker, Whatever> {} class Foo1 extends AbstractFoo { @Override protected List doInBackground() throws Exception { ... } } 

如果每个管理不同的类型,请使父类具有通用性,并使用所需类型实例化每个具体子类:

 class Whatever {} class Whichever {} abstract class GenericAbstractFoo extends SwingWorker {} class Foo2 extends GenericAbstractFoo, Whatever> { @Override protected List doInBackground() throws Exception { ... } } class Foo3 extends GenericAbstractFoo, Whichever> { @Override protected List doInBackground() throws Exception { ... } } 

如果需要更新GUI元素,则需要SwingWorker,例如调用SetText()等例程。 我从未想过将它们用于非GUI更新任务; 我总是将Thread分类或实现Runnable 。 我建议您尝试使用Foo类,并查看问题是否得到解决。