Java 在SwingWorker之外访问发布
当我耗时的代码位于Java 在SwingWorker之外访问发布,java,swing,swingworker,Java,Swing,Swingworker,当我耗时的代码位于SwingWorker中不包含的方法中时,我很难找到调用publish()和/或setProgress()的方法 举例说明: class Task extends SwingWorker<Void, Void> { @Override protected void process(List<Void> chunks) { // Process } @Override protected Void d
SwingWorker
中不包含的方法中时,我很难找到调用publish()
和/或setProgress()
的方法
举例说明:
class Task extends SwingWorker<Void, Void> {
@Override
protected void process(List<Void> chunks) {
// Process
}
@Override
protected Void doInBackground() throws Exception {
getData(this);
return null;
}
@Override
protected void done() {
// Done.
}
}
public Object[][] getData(SwingWorker worker) {
worker.publish(); // <-- publish() is protected, unavailable from outside.
worker.setProgress(1); // <-- same with setProgress().
return new Object[0][0];
}
类任务扩展SwingWorker{
@凌驾
受保护的无效进程(列表块){
//过程
}
@凌驾
受保护的Void doInBackground()引发异常{
获取数据(本);
返回null;
}
@凌驾
受保护的void done(){
//完成了。
}
}
公共对象[][]获取数据(SwingWorker-worker){
worker.publish();//您始终可以为SwingWorker类提供其他类可能调用的公共方法。这些方法可能非常简单,只需为其中一个受保护的方法提供包装器方法即可:
public void mySetProgress(int progress) {
super.setProgress(progress);
}
更好的方法:
另一种方法是重新思考您的程序结构——让您使用getData(…)
方法的对象返回临时结果,SwingWorker可以通过某种观察机制监听这些结果,然后让worker根据需要调用其发布方法
编辑2
您在评论中声明:
这两个都是我考虑过的解决方案,但它们似乎都有不幸的后果方法有大约20个步骤,我想发布。制作一个返回中间结果的程序结构需要我将其分解成更小的方法,并将结果传递给每个方法。看起来工作量太大了=/
不,不需要额外的方法。getData(…)方法需要做的只是定期更新类属性并通知侦听器。侦听器(这里是您的SwingWorker)然后可以提取类属性并使用它调用publish。您可以始终为SwingWorker类提供其他类可以调用的公共方法。这些方法可能非常简单,只需为其中一个受保护的方法使用包装器方法即可:
public void mySetProgress(int progress) {
super.setProgress(progress);
}
更好的方法:
另一种方法是重新思考您的程序结构——让您使用getData(…)
方法的对象返回临时结果,SwingWorker可以通过某种观察机制监听这些结果,然后让worker根据需要调用其发布方法
编辑2
您在评论中声明:
这两个都是我考虑过的解决方案,但它们似乎都有不幸的后果方法有大约20个步骤,我想发布。制作一个返回中间结果的程序结构需要我将其分解成更小的方法,并将结果传递给每个方法。看起来工作量太大了=/
不,不需要额外的方法。getData(…)方法需要做的只是定期更新类属性并通知侦听器。侦听器(这里是您的SwingWorker)然后可以提取类属性并使用它调用publish。您可以始终为SwingWorker类提供其他类可以调用的公共方法。这些方法可能非常简单,只需为其中一个受保护的方法使用包装器方法即可:
public void mySetProgress(int progress) {
super.setProgress(progress);
}
更好的方法:
另一种方法是重新思考您的程序结构——让您使用getData(…)
方法的对象返回临时结果,SwingWorker可以通过某种观察机制监听这些结果,然后让worker根据需要调用其发布方法
编辑2
您在评论中声明:
这两个都是我考虑过的解决方案,但它们似乎都有不幸的后果方法有大约20个步骤,我想发布。制作一个返回中间结果的程序结构需要我将其分解成更小的方法,并将结果传递给每个方法。看起来工作量太大了=/
不,不需要额外的方法。getData(…)方法需要做的只是定期更新类属性并通知侦听器。侦听器(这里是您的SwingWorker)然后可以提取类属性并使用它调用publish。您可以始终为SwingWorker类提供其他类可以调用的公共方法。这些方法可能非常简单,只需为其中一个受保护的方法使用包装器方法即可:
public void mySetProgress(int progress) {
super.setProgress(progress);
}
更好的方法:
另一种方法是重新思考您的程序结构——让您使用getData(…)
方法的对象返回临时结果,SwingWorker可以通过某种观察机制监听这些结果,然后让worker根据需要调用其发布方法
编辑2
您在评论中声明:
这两个都是我考虑过的解决方案,但它们似乎都有不幸的后果方法有大约20个步骤,我想发布。制作一个返回中间结果的程序结构需要我将其分解成更小的方法,并将结果传递给每个方法。看起来工作量太大了=/
不,不需要额外的方法。您的getData(…)方法需要做的只是定期更新类属性并通知侦听器。侦听器(此处是您的SwingWorker)然后可以提取类属性并使用它调用publish。darn,错误的注释(忽略了包装器,抱歉;-)无论如何,这不是一个好主意,最后一段描述了如何正确地解决它。@kleopatra:谢谢你的评论。是的,第二个建议对我来说似乎更强,因为它允许模型忽略控制,这是一件非常好的事情。这两个解决方案我都考虑过,但它们似乎都有不幸的后果。我的getData()
方法有大约20个步骤我想发布。制作一个返回临时结果的程序结构需要我将其分解成更小的方法,并将结果传递给每个方法。看起来工作量太大了=/@ryvantage:不,没有额外的满足