Swing/SwingWorker のバックアップ(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SwingWorker へ行く。
- 1 (2007-05-08 (火) 17:37:49)
- 2 (2007-07-25 (水) 12:36:00)
- 3 (2007-10-11 (木) 15:53:59)
- 4 (2007-12-21 (金) 14:56:02)
- 5 (2008-04-08 (火) 18:54:29)
- 6 (2008-06-18 (水) 12:35:43)
- 7 (2008-07-11 (金) 15:33:33)
- 8 (2009-11-11 (水) 17:38:54)
- 9 (2009-12-17 (木) 01:47:38)
- 10 (2009-12-17 (木) 11:02:55)
- 11 (2011-03-02 (水) 19:46:37)
- 12 (2011-06-13 (月) 16:55:18)
- 13 (2011-07-25 (月) 15:24:05)
- 14 (2011-12-02 (金) 17:23:03)
- 15 (2013-02-28 (木) 14:47:51)
- 16 (2013-09-19 (木) 19:28:33)
- 17 (2013-10-30 (水) 15:22:49)
- 18 (2014-01-21 (火) 19:07:39)
- 19 (2014-01-23 (木) 17:52:48)
- 20 (2014-06-05 (木) 02:22:21)
- 21 (2014-10-26 (日) 04:00:36)
- 22 (2015-11-15 (日) 03:13:09)
- 23 (2016-02-17 (水) 16:18:34)
- 24 (2016-05-28 (土) 18:23:27)
- 25 (2016-09-06 (火) 13:47:09)
- 26 (2017-03-29 (水) 13:54:29)
- 27 (2017-04-04 (火) 14:17:08)
- 28 (2017-08-18 (金) 18:57:31)
- 29 (2018-02-23 (金) 13:07:56)
- 30 (2019-05-22 (水) 19:35:38)
- 31 (2020-03-03 (火) 17:58:49)
- 32 (2021-08-07 (土) 14:34:10)
- 33 (2025-01-03 (金) 08:57:02)
- 34 (2025-01-03 (金) 09:01:23)
- 35 (2025-01-03 (金) 09:02:38)
- 36 (2025-01-03 (金) 09:03:21)
- 37 (2025-01-03 (金) 09:04:02)
- 38 (2025-06-19 (木) 12:41:37)
- 39 (2025-06-19 (木) 12:43:47)
TITLE:SwingWorkerを使った処理の中断と進捗状況表示
Posted by aterai at 2006-06-10
SwingWorkerを使った処理の中断と進捗状況表示
`JDK 6
で新しくなった
SwingWorker
`を使って、処理の中断や進捗状況の表示更新などを行います。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class RunAction extends AbstractAction{
public RunAction() {
super("run");
}
@Override public void actionPerformed(ActionEvent evt) {
//assert EventQueue.isDispatchThread();
System.out.println("actionPerformed() is EDT?: "
+ EventQueue.isDispatchThread());
final JProgressBar bar = new JProgressBar(0, 100);
runButton.setEnabled(false);
canButton.setEnabled(true);
icon.animationStart();
statusPanel.removeAll();
statusPanel.add(bar);
statusPanel.revalidate();
bar.setIndeterminate(true);
worker = new SwingWorker<String, String>() {
@Override public String doInBackground() {
System.out.println("doInBackground() is EDT?: "
+ EventQueue.isDispatchThread());
try { // dummy task
Thread.sleep(1000);
}catch(InterruptedException ie) {
return "Interrupted";
}
int current = 0;
int lengthOfTask = 120; //list.size();
publish("Length Of Task: " + lengthOfTask);
publish("------------------------------");
while(current<lengthOfTask && !isCancelled()) {
try { // dummy task
Thread.sleep(50);
}catch(InterruptedException ie) {
return "Interrupted";
}
setProgress(100 * current / lengthOfTask);
//worker.firePropertyChange("progress", current, current+1);
current++;
}
return "Done";
}
@Override protected void process(java.util.List<String> chunks) {
//assert EventQueue.isDispatchThread();
System.out.println("process() is EDT?: "
+ EventQueue.isDispatchThread());
for(String message : chunks) {
appendLine(message);
}
}
@Override public void done() {
//assert EventQueue.isDispatchThread();
System.out.println("done() is EDT?: "
+ EventQueue.isDispatchThread());
icon.animationStop();
runButton.setEnabled(true);
canButton.setEnabled(false);
statusPanel.remove(bar);
statusPanel.revalidate();
String text = null;
if(isCancelled()) {
text = "Cancelled";
}else{
try {
text = get();
}catch(Exception ex) {
ex.printStackTrace();
text = "Exception";
}
}
appendLine(text);
}
};
worker.addPropertyChangeListener(new ProgressListener(bar));
worker.execute();
}
}
class CancelAction extends AbstractAction{
public CancelAction() {
super("cancel");
}
@Override public void actionPerformed(ActionEvent evt) {
if(worker!=null && !worker.isDone()) {
worker.cancel(true);
}
worker = null;
}
}
View in GitHub: Java, Kotlin解説
以前の`SwingWorker.java
`から一部メソッド名が変更されていますが、基本的な使い方は一緒のようです。
- `
SwingWorker#execute()
メソッドで処理が開始され、
SwingWorker#doInBackground()
`メソッドが、バックグラウンドのスレッドで実行されます。 - `
EDT
で実行する必要のある処理(上記の例では処理中に
JTextArea
へのメッセージの書き出し)は、
SwingWorker#process()
メソッドをオーバーライドして
SwingWorker#publish()
メソッドで呼び出したり、
SwingWorker#firePropertyChange()
`を使えば良いようです。 - プログレスバーの処理には、`
SwingWorker#setProgress(int)
が予め用意されているので、
SwingWorker#addPropertyChangeListener(ProgressListener)
`を設定するだけで使用することが出来ます。 - 実行中の処理のキャンセルは、`
SwingWorker#cancel(boolean)
メソッドで行います。キャンセルされたかどうかは、
SwingWorker#isCancelled()
`メソッドで知ることが出来ます。
`EventQueue.isDispatchThread()
`を使うと以下のようになっています。
- `
actionPerformed() is EDT?
:
true
` - `
doInBackground() is EDT?
:
false
`- ここ(バックグラウンド)で重い処理を行い、`
EDT
`を停止(ブロック)しないようにする
- ここ(バックグラウンド)で重い処理を行い、`
- `
process() is EDT?
:
true
`- コンポーネントで進捗状況の表示を更新する場合は、`
EDT
で行う必要があるので、ここ(
process()
`メソッド内)で実行する
- コンポーネントで進捗状況の表示を更新する場合は、`
- `
done() is EDT?
:
true
`
参考リンク
- SwingWorker (Java Platform SE 6)
- Improve Application Performance With SwingWorker in Java SE 6
- Worker Threads and SwingWorker
- JTableのセルにJProgressBarを表示
- SwingWorkerで複数のJProgressBarを使用する
- SwingWorkerの一時停止と再開
コメント
以前の`-- ateraiSwingWorker
`の使い方などは、Timerでアニメーションするアイコンを作成、Fileの再帰的検索などのソースコードやリンク先を参考にしてみてください。- Fileの再帰的検索は、`
JDK 1.6
の
javax.swing.SwingWorker
`を使用するように変更しました。 - Timerでアニメーションするアイコンを作成は
https://swingworker.dev.java.net/ にある`JDK 1.6
からバックポートされた
org.jdesktop.swingworker.SwingWorker
`を使用するように変更しました。 -- aterai - `
java.net
が新しくなって結構時間が経ったけど、http://java.net/projects/swingworker から
jar
`がダウンロードできない…。maven2 のリポジトリから取得するしかない? -- aterai - 上記の`
jar
は、
1.1
なので、
1.2
が必要なら、 ソースを取得して、
ant bundles
` -- aterai
- Fileの再帰的検索は、`