Java 在另一个类中使用Swingworker发布方法

Java 在另一个类中使用Swingworker发布方法,java,swing,swingworker,Java,Swing,Swingworker,我有一个swingworker,这样我的GUI可以在后台工作时保持响应 问题是我需要在不同的点更新gui(例如,用程序状态/信息更新标签),但我有很多处理要做,我不能在一个巨大的doInBackground方法中完成 因此,我从doInBackground方法实例化了其他类来实现它,问题是除了在这个SW线程或EDT中,我无法更新gui 注意:为了简洁起见,我删除了不必要的代码 我希望能够从DoWork1和DoWork2等更新gui。我已尝试传递对SW swingworker对象的引用,但无法访问

我有一个swingworker,这样我的GUI可以在后台工作时保持响应

问题是我需要在不同的点更新gui(例如,用程序状态/信息更新标签),但我有很多处理要做,我不能在一个巨大的doInBackground方法中完成

因此,我从doInBackground方法实例化了其他类来实现它,问题是除了在这个SW线程或EDT中,我无法更新gui

注意:为了简洁起见,我删除了不必要的代码

我希望能够从DoWork1和DoWork2等更新gui。我已尝试传递对SW swingworker对象的引用,但无法访问publish方法,可能是因为它受到保护。我可能能够使用反射更新gui,但是任何使用我的代码的人都不会喜欢。我确实听到有人在某处提到使用反向接口,但没有例子,所以我不知道这一点

任何帮助都将不胜感激,谢谢

public class SW extends SwingWorker<Object, String> {

    private DoWork1 doWork1;
    private DoWork2 doWork2;
    private Iframe frame;

    public SW(Iframe frame, DoWork1 doWork1) {
        this.frame = frame;
        this.doWork1 = doWork1;
        this.doWork2 = new DoWork2();

    }

    @Override
    protected Object doInBackground() {
        doWork1.lotsOfWork("");
        publish("Can write to label from here");
        doWork2.lotsOfWork("", "");
        return null;
    }

    @Override
    public void process(List<String> chunks) {
        for (String s : chunks) {
            frame.getLabel().setText(s);
        }
    }

    @Override
    protected final void done() {
    }
}


public class DoWork1 {
    public DoWork1() {
    }
    private lotsOfWork(String s) {
        //Do lots of work in here
        //But need to update the gui with information!
        //would like to be able to do something like:
        publish("somehow write to label from here!?");
    }
}


public class DoWork2 {
    public DoWork2() {
    }
    private lotsOfWork(String s, String s) {
        //Do lots more work in here
        //But need to update the gui with information!
        //would like to be able to do something like:
        publish("somehow write to label from here!?");
    }
}
公共类软件扩展SwingWorker{
私人DoWork1 DoWork1;
私人DoWork2 DoWork2;
专用Iframe框架;
公共SW(Iframe帧,DoWork1 DoWork1){
this.frame=frame;
this.doWork1=doWork1;
this.doWork2=新的doWork2();
}
@凌驾
受保护对象doInBackground(){
doWork1.批料(“”);
发布(“可从此处写入标签”);
doWork2.布料(“,”);
返回null;
}
@凌驾
公共作废流程(列表块){
for(字符串s:块){
frame.getLabel().setText;
}
}
@凌驾
受保护的最终作废完成(){
}
}
公共类DoWork1{
公共工作1(){
}
私人lotsOfWork(字符串s){
//在这里做很多工作
//但是需要用信息更新gui!
//希望能够做到以下几点:
发布(“以某种方式从这里写入标签!?”;
}
}
公共类DoWork2{
公共工作2(){
}
私有lotsOfWork(字符串s,字符串s){
//在这里做更多的工作
//但是需要用信息更新gui!
//希望能够做到以下几点:
发布(“以某种方式从这里写入标签!?”;
}
}

在swingworker中创建一个名为say publishData的公共方法,然后调用受保护的publish方法,并通过变量或接口从其他类DoWork1访问publishData


这样,在dobackground工作方法中实例化的所有类也可以将数据发布到EDT/GUI。

我也遇到了同样的问题,我使用了许多不同的匿名Swingworker。因此,我将解决方案形式化为:

/**
 * Same as SwingWorker but providing a public publish function
 */
public abstract class MySwingWorker<T, V> extends SwingWorker<T, V> {
    public final void myPublish(V... args) {
        publish(args);
    }
}
/**
*与SwingWorker相同,但提供公共发布功能
*/
公共抽象类MyWingWorker扩展了SwingWorker{
公开最终作废myPublish(V…args){
出版(args);
}
}
我对这些匿名类使用
mywingworker
而不是
SwingWorker
,并将
mywingworker
实例传递给需要更新显示的方法。它为许多不同的
SwingWorker
类提供了一种一致的方法,即使在包之间也是如此,而不必使
SwingWorker
实现成为公共类

我想知道
publish()
受到保护是否有充分的理由。幸运的是,有一个简单的解决办法


要获得与此问题密切相关的更广泛范围的更好答案,请参阅Joe Coder的答案。

而不是从DoWork*类发布,难道你不能返回
lotsOfWork
的结果并在
SW
类中发布吗?@不能说有很多操作正在进行,其目的是通知用户程序的每一步。我想我已经找到了解决方案。如果其他类也扩展了swingworker,并且有一个进程方法和一个未使用的doinbackground方法,那么它们也可以写入/发布到GUI。找到了更好的方法。在swingworker中,创建一个名为say publishData的公共方法,然后调用受保护的publish方法,并从其他类DoWork1等访问publishData。