6

我想知道是否SwingWorker必须是我的主 GUI 中的嵌套类。我宁愿让它成为一个外部类,以使 GUI 从我的任何程序逻辑中保持清晰。

我试图使SwingWorker该类成为外部类,这对于该过程很好,不幸的是我无法从 SwingWorker 类访问我的任何 GUI 字段。每当我尝试从 SwingWorker 的方法中访问一个属性(例如标签或其他任何内容)时,done()我都会得到一个 nullPointer 异常。

任何建议将不胜感激!


首先非常感谢杰夫!到目前为止工作正常,即使我无法按照您提出的第二个选项关注您。我的一项后台任务计算了某个大小(长值),因此从我的 GUI 中获取该值会很好。

您建议使用 getter 和 setter,但不幸的是我不知道如何在 SwingWorker 类中实现它们。

我试过这样:

public void setSize(long totalSize) {
     this.totalSize = totalSize;
}
public long getTotalSize() {
     return totalSize;
}

在方法结束时调用 setter doInBackground()。不幸的是,我无法使用get()我的 GUI 中的方法。

final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
    public void run() {
        // do something with w.get()
    }
};
w.setRunnable(r);
w.execute();

在我的情况下,“w”的对象创建不起作用,因为构造函数需要一个 Runnable 对象。我错过了什么吗?请放轻松,这是我第一次与 SwingWorker 合作。:) 再次感谢您的帮助!

4

1 回答 1

6

您可以将 SwingWorker 设为外部类。但是,就像任何其他类一样,如果它看不到变量(例如您要设置的标签),当然它将无法设置它。您可以做的一件事是向工作人员传递一个 Runnable,它在完成时执行。

public class MySwingWorker extends SwingWorker {

   private final Runnable r;
   public MySwingWorker(Runnable r) {
       this.r = r;
   }
   public void doInBackground() {...}
   public void done() { r.run(); }
 }

现在从 GUI 中,您可能会执行类似的操作

Runnable updateLabel = new Runnable() {
       public void run() {
           label.setText("myValue");
       }
};
SwingWorker w = new MySwingWorker(updateLabel);
w.execute();

如果您想使用 SwingWorker 的结果,这会有点棘手,尽管这是可能的。与其将 Runnable 传递给 swing worker 的构造函数,不如使用一个 setter 方法,然后它将类似于:

final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
    public void run() {
        // do something with w.get()
    }
};
w.setRunnable(r);
w.execute();

在任何一种情况下,Runnable 的功能都类似于在 worker 完成时执行的闭包。

于 2010-02-18T12:49:23.280 回答