在另一个 class 中使用 Swingworker publish 方法
Using Swingworker publish method in another class
我有一个 swingworker,这样当我在后台工作时我的 GUI 可以保持响应。
问题是我需要在各个点更新图形用户界面(例如用程序 status/info 更新标签),但我有很多处理工作要做,我无法在一个巨大的系统中完成所有工作doInBackground 方法。
所以我从 doInBackground 方法中实例化其他 类 来执行此操作,问题是我无法更新 gui,除非在此 SW 线程或 EDT 中。
注意:为简洁起见,我删除了不必要的代码
我希望能够从 DoWork1 和 DoWork2 等更新 gui。我尝试传递对 SW swingworker 对象的引用,但无法访问 publish 方法,大概是因为它受到保护。我也许可以使用反射更新图形用户界面,但使用我的代码的任何人都不会喜欢那样。我确实听到有人在某处提到过使用反向接口,但是没有例子所以我不知道那个..
如有任何帮助,我们将不胜感激。
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 中创建一个名为 say publishData 的 public 方法,然后调用受保护的发布方法,并通过变量或接口从另一个 类 DoWork1 访问 publishData。
这样所有在 dobackground work 方法中实例化的 类 也可以向 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);
}
}
对于这些匿名 类,我使用 MySwingWorker
而不是 SwingWorker
,并将 MySwingWorker
实例传递给需要更新显示的方法。它为许多相当不同的 SwingWorker
类 提供了一致的方法,即使在包之间,也不必进行 SwingWorker
实现 public 类 .
我想知道 publish()
是否有充分的理由受到保护。幸运的是,有一个简单的解决方法。
有关解决与此问题密切相关的更广泛范围的更好答案,请参阅 Joe Coder 至 a similar question 的答案。
我有一个 swingworker,这样当我在后台工作时我的 GUI 可以保持响应。
问题是我需要在各个点更新图形用户界面(例如用程序 status/info 更新标签),但我有很多处理工作要做,我无法在一个巨大的系统中完成所有工作doInBackground 方法。
所以我从 doInBackground 方法中实例化其他 类 来执行此操作,问题是我无法更新 gui,除非在此 SW 线程或 EDT 中。
注意:为简洁起见,我删除了不必要的代码
我希望能够从 DoWork1 和 DoWork2 等更新 gui。我尝试传递对 SW swingworker 对象的引用,但无法访问 publish 方法,大概是因为它受到保护。我也许可以使用反射更新图形用户界面,但使用我的代码的任何人都不会喜欢那样。我确实听到有人在某处提到过使用反向接口,但是没有例子所以我不知道那个..
如有任何帮助,我们将不胜感激。
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 中创建一个名为 say publishData 的 public 方法,然后调用受保护的发布方法,并通过变量或接口从另一个 类 DoWork1 访问 publishData。
这样所有在 dobackground work 方法中实例化的 类 也可以向 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);
}
}
对于这些匿名 类,我使用 MySwingWorker
而不是 SwingWorker
,并将 MySwingWorker
实例传递给需要更新显示的方法。它为许多相当不同的 SwingWorker
类 提供了一致的方法,即使在包之间,也不必进行 SwingWorker
实现 public 类 .
我想知道 publish()
是否有充分的理由受到保护。幸运的是,有一个简单的解决方法。
有关解决与此问题密切相关的更广泛范围的更好答案,请参阅 Joe Coder 至 a similar question 的答案。