まず考えるべきは Swing 内の SwingWorkder オブジェクトですが、インターネット上で既製のサンプルを見つけるのは困難で、主にインターネット上の情報を参照して自分で作成しました。
注: SwingWorkder オブジェクトは 1 回のみ実行でき、繰り返し実行することはできません。たとえば、[開始] をクリックした場合、終了すると再度開始することはできません。
次のようにコードをコピーします。
インポートjava.awt.BorderLayout;
インポート java.awt.event.*;
java.beans.PropertyChangeEventをインポートします。
インポート java.beans.PropertyChangeListener;
java.util.Listをインポートします。
インポートjava.util.concurrent.ExecutionException;
javax.swing.* をインポートします。
インポート javax.swing.SwingWorker;
パブリック クラス SwingWorkerSample {
public static void main(String[] args) {
// 外観定義
試す {
UIMマネージャー
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (例外例) {
}
// 形状
JFrame f = new JFrame("SwingWorker サンプル");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//表現領域
最終的な JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.add(sp);
// 下部の進行状況バー
Final JProgressBar progressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, progressBar);
// スタートボタン
JButton b = new JButton("Start");
f.add(BorderLayout.NORTH, b);
// 終了ボタン
JButton b2 = new JButton("End");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// SwingWorker クラス
Final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** 操作を実行します*/
@オーバーライド
protected Integer doInBackground() が例外をスローする {
int 合計 = 0;
if (!this.isCancelled()) {
for (int i = 1; i <= 10; ++i) {
合計 += i;
public(new int[] { i, sum });//中間結果を表す呼び出し
setProgress(i * 10); // プログレスバー
Thread.sleep(1000);
}
}
合計を返します。
}
/** 中間結果を表します*/
@オーバーライド
protected void process(List<int[]> チャンク) {
StringBuilder sb = 新しい StringBuilder();
for (int[] 値: チャンク) {
sb.append(String.format("累積された %d は %d%n に等しい", 値[0], 値[1]));
}
taOutput.append(sb.toString());
}
/** 処理が完了しました*/
@オーバーライド
protected voidned() {
if (this != null && !this.isDone()) {
試す {
int 結果 = get();
taOutput.append("完了。合計" + 結果 + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
};
// プログレスバーの表現
sw.addPropertyChangeListener(new PropertyChangeListener() {
@オーバーライド
public void propertyChange(PropertyChangeEvent evt) {
if ("進行状況".equals(evt.getPropertyName())) {
progressBar.setValue((整数) evt.getNewValue());
}
}
});
//スタートボタンイベント
b.addActionListener(new ActionListener() {
@オーバーライド
public void actionPerformed(ActionEvent e) {
sw.execute();//SwingWorkderを非同期で呼び出す
}
});
// 終了ボタン
b2.addActionListener(new ActionListener() {
@オーバーライド
public void actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
// キャンセル
sw.キャンセル(true);
}
JOptionPane.showMessageDialog(null, "終了!");
}
});
// フォーム表現
f.pack();
f.setVisible(true);
}
}