java - 进度条 - 是否可以在doInBackground()方法之外使用Progress Bar的setProgess()?

时间:2012-12-05 06:52:48

标签: java swing progress swingworker jprogressbar

如果我在doInBackground()中有一个属于其他类的方法,是否可以根据外部类的其他方法中发生的更改来设置setProgess()?

2 个答案:

答案 0 :(得分:5)

你说:

  

但是当我将setProgess()放在另一个类的方法中时,它告诉我需要创建该方法。

这与SwingWorker无关,而与基本Java无关。没有类可以在类的有效实例上调用另一个类实例(非静态)方法。要使代码生效,“其他”方法必须在SwingWorker的实例上调用setProgress(...),因此必须将SwingWorker的引用传递给其他类。因此,将SwingWorker(SwingWorker内部的this)传递给另一个类,然后您可以愉快地调用其方法。同样,这与线程,Swing或SwingWorkers无关,而是基本的面包和黄油Java。

编辑:由于setProgress是受保护的并且是最终的,因此您的SwingWorker必须具有另一个类可以调用的公共方法,并且在此方法中,SwingWorker将需要调用其自己的setProgress(...)方法。

如,

MyWorker类

public class MyWorker extends SwingWorker<Integer, Integer> {
   private OtherClass otherClass;

   public MyWorker() {
      otherClass = new OtherClass(this);
   }

   @Override
   protected Integer doInBackground() throws Exception {
      otherClass.otherMethod();
      return null;
   }

   // public method that exposes setProgress
   public void publicSetProgress(int prog) {
      setProgress(prog);
   }

}

OtherClass:

class OtherClass {
   MyWorker myWorker;

   public OtherClass(MyWorker myWorker) {
      this.myWorker = myWorker;
   }

   public void otherMethod() {
      for (int i = 0; i < 100; i++) {
         myWorker.publicSetProgress(i);
         try {
            Thread.sleep(200);
         } catch (InterruptedException e) {}
      }
   }
}

答案 1 :(得分:1)

只要您担心必须更新栏,就可以通过调用适当的方法,在您可以访问实例的任何地方实现它。它不依赖于方法或类。 (对于Java中的每个对象都是如此)。

根据您的评论,您应该将对该栏的引用作为该方法中的参数传递。否则,您将无法访问它。