我对SwingWorker和Java GUI有疑问。
我有几个处理信息的类,我们可以称之为Foo1
,Foo2
和Foo3
。此处理可能需要很长时间。
这些都是Foo
的子类,但Foo
本身并未直接调用(Foo[x]
类使用从Foo
继承的方法。为了保持EDT免费绘制进度条,保留对象层次结构时使用SwingWorker
的最佳方法是什么?是否可以使用Foo1Worker extends SwingWorker
之类的包装类并使其doInBackground()
调用{{1虽然Foo1.myProcessMethod()
没有延伸Foo1
,但这仍然可以按预期运行吗?
编辑:为了澄清我的问题,即使他们已经是子类,我如何制作SwingWorker
SwingWorkers?
答案 0 :(得分:2)
我认为答案主要取决于Foo
子类管理的数据类型。如果结果是同构的,只需扩展SwingWorker
并相应地实例化具体的子类:
class Whatever {}
abstract class AbstractFoo extends SwingWorker<List<Whatever>, Whatever> {}
class Foo1 extends AbstractFoo {
@Override
protected List<Whatever> doInBackground() throws Exception {
...
}
}
如果每个管理不同的类型,请使父类具有通用性,并使用所需类型实例化每个具体子类:
class Whatever {}
class Whichever {}
abstract class GenericAbstractFoo<T, V> extends SwingWorker<T, V> {}
class Foo2 extends GenericAbstractFoo<List<Whatever>, Whatever> {
@Override
protected List<Whatever> doInBackground() throws Exception {
...
}
}
class Foo3 extends GenericAbstractFoo<List<Whichever>, Whichever> {
@Override
protected List<Whichever> doInBackground() throws Exception {
...
}
}
答案 1 :(得分:0)
如果您需要更新GUI元素,则需要SwingWorker,例如调用例如SetText()
的例程。我从未想过将它们用于非GUI更新任务;我总是对Thread
进行细分或实施Runnable
。我建议您尝试使用Foo类,看看问题是否得到解决。