【问题标题】:Swing Worker Thread : Inner class vs passing parameterSwing Worker Thread:内部类与传递参数
【发布时间】:2012-05-29 16:16:55
【问题描述】:

我知道 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 中哪个是正确的。如果两者都是“正确的”,那么一个对另一个的优缺点是什么。

【问题讨论】:

  • 实际上,这里鼓励任何不是太笼统而无法回答的问题。

标签: java swing inner-classes jtextpane swingworker


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的答案。代码可读性的问题很重要,因为我的 Swing 工人类非常大。对于 3 个函数的调用,我在 EDT 的其他地方使用了 3 个不同的函数。您是否建议我创建另一种方法来重新组合 3 个函数并仅调用该单个方法。如果是,为什么简单地调用 3 个函数更好?
  • 从根本上来说并没有更好。但是如果你的 swing worker 的最终结果是调用这三个方法,那可能意味着它们构成了某种原子操作,可以放在自己的方法中。
【解决方案2】:

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

我个人会尽量避免传递 UI(元素)本身,而是传递将由 SwingWorker 更新的模型/流/...,这样我就可以稍后重构 UI 而不必摆弄我的SwingWorker 班级。

【讨论】:

  • 谢谢你的答案。我没有通过元素,我明白这一点。我只传递了一些复选框和菜单的状态,这些复选框和菜单定义了要执行的计算。传递参数并不是那么复杂,只是要求一些写作。问题更多在于调用我的“完成”中的函数,这些函数要求我在参数中传递框架。这是我不确定在 java 中这样做是否正确的要点。
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 2014-10-14
  • 1970-01-01
  • 2020-12-15
  • 2011-08-09
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多