2010-07-01 99 views
1

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

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

这些都是Foo所有子类,但是Foo不是直接调用本身(Foo[x]类使用从Foo继承的方法。为了保持EDT自由画一个进度条,什么是使用SwingWorker时的最佳方式?让我的对象层次结构有可能有包装类如Foo1Worker extends SwingWorker,并有其doInBackground()呼叫Foo1.myProcessMethod()即使Foo1不延长SwingWorker,将这个还是工作,我期待它

编辑:??澄清我的问题,我该如何制作Foo[x] SwingW即使他们已经是亚类?

回答

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 { 
     ... 
    } 
} 
+0

在第一个例子中,Abstract Foo,应该是我的超类'Foo'吗? – Ryan 2010-07-02 23:36:55

+0

@Ryan:是的。这不是必需的,但它为可能使用您的API的其他人提供了一些安全和便利。特别是,它排除了无意中实例化基类。 http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html – trashgod 2010-07-02 23:48:06

0

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

+0

甲SwingWorker是一个包装器,它允许你在EDT上执行处理和运行,以确保正确的GUI更新,除非我不理解某些东西。在处理和更新GUI时查看这个例子的使用。 http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html – Ryan 2010-07-01 16:39:12

+0

进一步的评论:显然,数据处理例程(你的Foo例程)的结果必须显示给屏幕在某些方面,在某些时候。我所做的是让他们将数据保存在一个Concurrent数据结构中(通常是'ConcurrentHashMap'或'ArrayBlockingQueue'),然后创建一个读取和显示数据的教科书风格的“SwingWorker”。 – Pete 2010-07-01 16:44:21

+0

@Ryan:我的观点是,我发现使用SwingWorkers仅仅用于你绝对需要它们的东西要好得多,它使用'Publish()'和'Process()'直接更新GUI。我将实际的数据处理和计算分解为直线“线程”或“运行子程序”。这具有将我的肉和土豆代码与我的屏幕更新代码完全分开的额外好处。 – Pete 2010-07-01 16:51:43