Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker必须是嵌套类吗?_Java_User Interface_Nested Class_Swingworker - Fatal编程技术网

Java SwingWorker必须是嵌套类吗?

Java SwingWorker必须是嵌套类吗?,java,user-interface,nested-class,swingworker,Java,User Interface,Nested Class,Swingworker,我想知道SwingWorker是否必须是我的主GUI中的嵌套类。我宁愿将其设置为一个外部类,以使GUI不受任何程序逻辑的影响 我尝试将SwingWorker类设置为外部,这对流程来说很好,不幸的是,我无法从SwingWorker类访问任何GUI字段。 每当我试图从SwingWorker的done()方法中访问属性(如标签或任何内容)时,我都会收到一个nullPointer异常 任何建议都将不胜感激 首先非常感谢杰夫!到目前为止效果很好,尽管我无法理解你提出的第二个选项。 我的一个后台任务计算特

我想知道
SwingWorker
是否必须是我的主GUI中的嵌套类。我宁愿将其设置为一个外部类,以使GUI不受任何程序逻辑的影响

我尝试将
SwingWorker
类设置为外部,这对流程来说很好,不幸的是,我无法从SwingWorker类访问任何GUI字段。 每当我试图从SwingWorker的
done()
方法中访问属性(如标签或任何内容)时,我都会收到一个nullPointer异常

任何建议都将不胜感激


首先非常感谢杰夫!到目前为止效果很好,尽管我无法理解你提出的第二个选项。 我的一个后台任务计算特定的大小(长值),所以从我的GUI中获取该值会很好

final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
    public void run() {
        // do something with w.get()
    }
};
w.setRunnable(r);
w.execute();
您建议使用getter和setter,但不幸的是,我不知道如何在SwingWorker类中实现它们

我这样试过:

public void setSize(long totalSize) {
     this.totalSize = totalSize;
}
public long getTotalSize() {
     return totalSize;
}
setter在
doInBackground()方法的末尾被调用。不幸的是,我无法从GUI使用
get()
方法

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一起工作。:)
再次感谢您的帮助

您可以将SwingWorker设置为外部类。然而,就像任何其他类一样,如果它看不到变量(例如,您想要设置的标签),当然它将无法设置它。您可以做的一件事是向worker传递一个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完成时执行的闭包类似。

也可以在构造函数中传递标签,而不是Runnable。不过,为每一个小动作定义一个新的worker子类可能有些过分。匿名类非常适合解决组合一个非常小、紧密耦合的对象这一特殊问题。这取决于这是否是一个单一的用例。如果您在许多地方进行抽象,那么抽象是有效的。哦,闭包会有多大帮助。