他のクラスに属するdoInBackground()内にメソッドがある場合、外部クラスの他のメソッドで発生する変更に基づいてsetProgess()を設定することは可能ですか?
2 に答える
あなたは次のように述べています。
しかし、setProgess()を別のクラスのメソッド内に置くと、そのメソッドを作成する必要があることがわかります。
これはSwingWorkerとは何の関係もなく、すべて基本的なJavaと関係があります。クラスの有効なインスタンスで呼び出さずに、別のクラスインスタンス(非静的)メソッドを呼び出すことはできません。コードが機能するには、「other」メソッドsetProgress(...)
がSwingWorkerのインスタンスを呼び出す必要があるため、SwingWorkerの参照を他のクラスに渡す必要があります。したがって、SwingWorker(SwingWorkerthis
内)を他のクラスに渡すと、そのメソッドを楽しく呼び出すことができます。繰り返しますが、これはスレッド化、Swing、またはSwingWorkersとは関係ありませんが、基本的なパンとバターのJavaです。
編集:setProgressは保護されており、finalであるため、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);
}
}
その他のクラス:
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) {}
}
}
}
バーを更新する必要があることを懸念している限り、適切なメソッドを呼び出すことで、インスタンスにアクセスできる場所であればどこでもバーを更新できます。メソッドやクラスに依存しません。(これは、Javaのすべてのオブジェクトに当てはまります)。
コメントごとに、そのメソッドのパラメーターとして、バーへの参照を渡す必要があります。そうしないと、アクセスできなくなります。