DOES SwingWorkerのは、ネストされたクラスである必要がありますか?
-
21-09-2019 - |
質問
SwingWorker
が私のメインのGUI内でネストされたクラスである必要があります場合は、私は思ったんだけど。私はむしろ私のプログラムロジックのいずれかからGUI明確に保つために、それを外部のクラスを作ると思います。
私はプロセスのために罰金を働く外部SwingWorker
クラスを作ってみました、残念ながら私はSwingWorkerのクラスから私のGUIのフィールドのいずれかにアクセスすることはできません。
私は、このようなSwingWorkerののdone()
メソッド内からラベルまたは何のように、属性にアクセスしようとするたびに、私はnullポインタ例外を取得します。
何かアドバイスをいただければ幸いです!
<時間>まず第一には、非常に多くのジェフありがとうございました!私はあなたが提示番目のオプションであなたに従うことができなかったにも関わらず、これまで正常に動作します。 私のGUIからその値を取得するにはいいだろうので、私のバックグラウンドタスクの1つは、特定のサイズ(長い値)を算出する。
あなたはgetterとsetterで動作するように提案したが、残念ながら、私はSwingWorkerのクラスでそれらを実装する方法には何のアイデアを得ませんしました。
私はこのようにそれを試してみました。
public void setSize(long totalSize) {
this.totalSize = totalSize;
}
public long getTotalSize() {
return totalSize;
}
はセッターはdoInBackground()
方法の終了時に呼び出されます。残念ながら、私は私のGUIからget()
メソッドを使用することはできません。
final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
public void run() {
// do something with w.get()
}
};
w.setRunnable(r);
w.execute();
コンストラクタが実行可能のオブジェクトが必要として、私の場合には動作しません「W」のオブジェクトの作成。 私何か不足していますか? それは私がSwingWorkerのと連携初めてです、私に簡単にアクセスしてください。 :) ここでも、あなたの助けのためにどうもありがとうございました!
解決
あなたはSwingWorkerの外部クラスにすることができます。それは変数を見ることができない場合は、単に他のクラスと同様に、(例えば、ラベルは、設定したい)、もちろんそれを設定することはできません。あなたができることの一つは、それが完了したときに、それが実行されることを労働者にRunnableをを渡すことです。
public class MySwingWorker extends SwingWorker {
private final Runnable r;
public MySwingWorker(Runnable r) {
this.r = r;
}
public void doInBackground() {...}
public void done() { r.run(); }
}
今GUIから、あなたのような何かをするかもしれません。
Runnable updateLabel = new Runnable() {
public void run() {
label.setText("myValue");
}
};
SwingWorker w = new MySwingWorker(updateLabel);
w.execute();
あなたはそれが可能であるが、SwingWorkerの結果を使用したい場合は、これは、ビットトリッキーを取得します。むしろスイングワーカーのコンストラクタにRunnableを渡すよりも、のようなものを使用すると、setterメソッドを持っているでしょうし、それは次のようになります:
final MySwingWorker w = new MySwingWorker();
Runnable r = new Runnable() {
public void run() {
// do something with w.get()
}
};
w.setRunnable(r);
w.execute();
いずれの場合においても、Runnableをワーカーが終了したときに実行されるクロージャと同様に機能している。