Java GUI线程 – SwingWorker
我有一个关于SwingWorker和Java GUI的问题。
我有几个处理信息的类,我们可以称它们为Foo1
, Foo2
和Foo3
。 此处理可能需要很长时间。
这些都是Foo
子类,但是Foo
不是直接调用的( Foo[x]
类使用从Foo
inheritance的方法。为了保持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类,并查看问题是否得到解决。