我有一个关于SwingWorker和Java GUI的问题。
我有几个处理信息的类,我们可以称它们为Foo1、Foo2和Foo3。这一过程可能需要很长时间。
这些都是Foo的子类,但是Foo本身并不直接调用( Foo[x]类使用从Foo继承的方法。为了让EDT自由地绘制进度条,在保持对象层次结构的同时使用SwingWorker的最好方法是什么?有没有可能有像Foo1Worker extends SwingWorker这样的包装类,并让它的doInBackground()调用Foo1.myProcessMethod()?即使Foo1没有扩展SwingWorker,它仍然可以像我期望的那样工作吗?
编辑:为了澄清我的问题,即使它们已经是子类,我如何才能使Foo[x] SwingWorkers?
发布于 2010-07-02 03:04:24
我认为答案取决于由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 {
...
}
}发布于 2010-07-02 00:21:18
如果你需要更新图形用户界面元素,比如调用像SetText()这样的例程,你需要一个SwingWorker。我从来没有考虑过将它们用于非图形用户界面更新任务;我总是对Thread或实现的Runnable进行子类化。我建议你在你的Foo类中尝试这样做,看看这个问题是否会自行解决。
https://stackoverflow.com/questions/3159547
复制相似问题