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子类可能有些过分。匿名类非常适合解决组合一个非常小、紧密耦合的对象这一特殊问题。这取决于这是否是一个单一的用例。如果您在许多地方进行抽象,那么抽象是有效的。哦,闭包会有多大帮助。