1

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

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

这些都是 的子类Foo,但是Foo本身并不直接调用(这些Foo[x]类使用从 继承的方法Foo。为了让 EDT 自由绘制进度条,SwingWorker在保持我的对象层次结构时最好使用什么方法?是否可以有包装类,比如Foo1Worker extends SwingWorkerand 有它的doInBackground()调用Foo1.myProcessMethod()吗?即使Foo1不扩展SwingWorker,这仍然会像我期望的那样工作吗?

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

4

2 回答 2

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 {
        ...
    }
}
于 2010-07-01T19:04:23.617 回答
0

如果您需要更新 GUI 元素,例如调用例程,如SetText(). 我从未想过将它们用于非 GUI 更新任务;我一直细分Thread或实施Runnable. 我建议你用你的 Foo 类试试这个,看看问题是否能解决。

于 2010-07-01T16:21:17.730 回答