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:不,没有额外的满足