我知道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中哪一个是正确的。如果两者都是“正确的”,那么一方与另一方的利弊是什么。
答案 0 :(得分:2)
两种方法都可以。内部类的优点是它可以访问封闭对象的内部。缺点是它不能在另一个上下文中重复使用(例如,另一个具有类似接口的帧)。
确保您的代码结构良好且易读。例如,您可能希望在框架的单个方法中在done()
方法中提取三个方法调用。
答案 1 :(得分:2)
如果您需要在困扰您的构造函数中传递大量参数,则可以将这些参数分组到容器对象中并传递容器(例如MyWorkerContext
类)。
我个人会尽量避免传递UI(元素)本身,而是传递一个模型/流/ ...将由SwingWorker
更新,允许我稍后重构UI而不必摆弄我的SwingWorker
课程。