Java GUI线程 - SwingWorker

时间:2010-07-01 16:01:10

标签: java multithreading user-interface swing swingworker

我对SwingWorker和Java GUI有疑问。

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

这些都是Foo的子类,但Foo本身并未直接调用(Foo[x]类使用从Foo继承的方法。为了保持EDT免费绘制进度条,保留对象层次结构时使用SwingWorker的最佳方法是什么?是否可以使用Foo1Worker extends SwingWorker之类的包装类并使其doInBackground()调用{{1虽然Foo1.myProcessMethod()没有延伸Foo1,但这仍然可以按预期运行吗?

编辑:为了澄清我的问题,即使他们已经是子类,我如何制作SwingWorker SwingWorkers?

2 个答案:

答案 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类,看看问题是否得到解决。