以下は、期待どおりに Java GUI を更新しなかった SwingWorker インスタンスです。
SwingWorker は、ボタンのアクション リスナー内に実装されます。ループを定義するmin
とmax
はどちらも、アクション リスナーに対してローカルな「最終的な int」です。
SwingWorker は、反復ごとにNQueens
オブジェクトの go() メソッドを呼び出し、n-queens のすべてのソリューションを再帰的に見つけることになっています。次に、NQueens
オブジェクトtoString()
が呼び出された後、文字列が発行され、process() メソッドが と を更新しjProgressBar
ますjTextArea
。ただし、ボタンを押しても何も起こりません。これは、GUI コンポーネントの更新と組み合わせた集中的なプロセスを実装する方法ですか?
new SwingWorker <Void,String>()
{
private int totalPercent;
@Override
protected Void doInBackground()
{
int diff = max - min + 1;
int percent = 100;
if(diff != 0)
{
percent = 100/diff;
}
totalPercent = 0;
NQueens queens = new NQueens(min);
for(int j = min; j <= max; j++)
{
queens.go();
totalPercent += percent;
String newText = queens.toString();
publish(newText);
queens.nextSet();
}
isCalced = true;
return null;
}
protected void process(String results)
{
jTextArea2.append(results);
jProgressBar1.setValue(totalPercent);
jProgressBar1.repaint();
}
}.execute();