3

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

我的应用程序生成大型 HTML 文本以响应显示在 jTextPane 中的计算过程。为了避免阻塞我曾经在 Swing 工作线程中进行计算的 GUI。

我的问题是以下开始计算我需要在 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 中哪一个是正确的。如果两者都是“正确的”,那么一个对另一个的利弊是什么。

4

2 回答 2

2

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

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

于 2012-05-23T06:49:43.973 回答
2

如果困扰您的是您必须在构造函数中传递的大量参数,您可以将这些参数分组到一个容器对象中,然后只传递容器(例如一个MyWorkerContext类)。

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

于 2012-05-23T07:35:46.057 回答