Swing Worker Thread:内部类与传递参数

时间:2012-05-23 06:17:12

标签: java swing inner-classes jtextpane swingworker

我知道SO是针对特定问题的,但我需要建议Java中使用swing工作线程的正确做法。

我的应用程序生成大型HTML文本以响应计算过程,该过程显示在jTextPane中。为了避免阻止GUI我曾经在Swing Worker Thread中进行计算。

我的问题是如下开始计算我需要在GUI的不同菜单复选框和列表框中提供大量信息,并且在计算结束时我需要在EDT中启动函数。

以下是我的两种可能性:

首先是向我的Swing Worker发送大量信息,还需要传递MainFrame以访问“done()”中的特定功能

public class MyWorker extends SwingWorker<Void, Void> {      

    private MyMainFrame frame;
    public MyWorker(plenty of params) {
    }

    @Override
    public Void doInBackground() {
        //my background process
    }

    @Override
    public void done() {
    frame.myfunc1;
    frame.myfunc2;
    frame.myfunc3;
    }
}

第二个是使用内部类

在Java中哪一个是正确的。如果两者都是“正确的”,那么一方与另一方的利弊是什么。

2 个答案:

答案 0 :(得分:2)

两种方法都可以。内部类的优点是它可以访问封闭对象的内部。缺点是它不能在另一个上下文中重复使用(例如,另一个具有类似接口的帧)。

确保您的代码结构良好且易读。例如,您可能希望在框架的单个方法中在done()方法中提取三个方法调用。

答案 1 :(得分:2)

如果您需要在困扰您的构造函数中传递大量参数,则可以将这些参数分组到容器对象中并传递容器(例如MyWorkerContext类)。

我个人会尽量避免传递UI(元素)本身,而是传递一个模型/流/ ...将由SwingWorker更新,允许我稍后重构UI而不必摆弄我的SwingWorker课程。