Java Swing工作线程:内部类与传递参数

Java Swing工作线程:内部类与传递参数,java,swing,inner-classes,jtextpane,swingworker,Java,Swing,Inner Classes,Jtextpane,Swingworker,我知道这是针对特定问题的,但我需要一个关于在Java中使用swing worker线程的正确做法的建议 我的应用程序生成大型HTML文本以响应jTextPane中显示的计算过程。为了避免阻塞GUI,我使用Swing Worker线程进行计算 我的问题是,要开始计算,我需要在GUI的不同菜单复选框和列表框中提供大量信息,在计算结束时,我需要启动EDT中的功能 我有两种可能: 第一个是向Swing Worker发送大量信息,还需要传递大型机以访问“done()中的特定函数” 公共类MyWorker扩

我知道这是针对特定问题的,但我需要一个关于在Java中使用swing worker线程的正确做法的建议

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

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

我有两种可能:

第一个是向Swing Worker发送大量信息,还需要传递大型机以访问“done()中的特定函数”

公共类MyWorker扩展SwingWorker{
私有主机框架;
公共MyWorker(大量参数){
}
@凌驾
公共无效doInBackground(){
//我的后台进程
}
@凌驾
公众假期结束(){
frame.myfunc1;
frame.myfunc2;
frame.myfunc3;
}
}
第二种方法是使用内部类


在Java中哪一个是正确的。如果两种方法都是“正确的”,那么一种方法与另一种方法的优缺点是什么。

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


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

如果您必须在构造函数中传递大量参数,那么您可以将这些参数分组到容器对象中,然后只传递容器(例如,a
MyWorkerContext
class)


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

Thx作为答案。代码可读性问题很重要,因为我的swing worker类相当大。对于3个函数的调用,我在EDT的其他地方使用了3个不同的函数。你是否建议我创建另一个方法来重新组合这3个函数并只调用单个方法。如果是,为什么只调用这3个函数会更好?从根本上说,这并不是更好。但如果swing worker的最终结果是调用这三个方法,那么可能意味着ns表示它们构成某种原子操作,可以用自己的方法进行。实际上,这里鼓励回答任何不太笼统的问题。答案是Thx。我不传递元素,我理解。我只传递一些复选框和菜单的状态,它们定义了要执行的计算。传递参数ters并不是那么复杂,只是需要一些编写。问题更多的是在我的“done”中调用函数,这些函数要求我在参数中传递帧。这是我不确定在java中这样做是否正确的主要问题。
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;
    }
}