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

时间:2015-01-25 10:07:41

标签: java swing swingworker

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

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

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

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

我希望能够从DoWork1&更新gui。 DoWork2等我试过传递对SW swingworker对象的引用,但是不能访问发布方法,大概是因为它受到保护。我可以使用反射来更新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!?");
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我遇到了同样的问题,而且我使用了许多不同的匿名SwingWorkers。所以,我用这种方式正式化了解决方案:

/**
 * 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);
    }
}

我对这些匿名类使用MySwingWorker而不是SwingWorker,并将MySwingWorker实例传递给需要更新显示的方法。它为一些相当不同的SwingWorker类提供了一致的方法,甚至在包之间,而不必使SwingWorker实现公共类。

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

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