JAVA SwingWorkder的使用例

最近在學習Swing,咱們都知道在UI表現線程裏面長時間執行操做時,畫面會假死,爲了可以讓費時操做不影響畫面表現,就須要用多線程了。首先考慮的就是Swing內部的 SwingWorkder對象,可是網上現成的例子很差找,主要參照了下面的URL,本身整理了一個。java

http://d.hatena.ne.jp/nowokay/20081207/1228644742多線程

 

注意:SwingWorkder對象只能執行一次,不能重複執行!例如點擊開始,結束後,就不能再次開始了。app

import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.SwingWorker;

public class SwingWorkerSample {

	public static void main(String[] args) {

		// 外觀定義
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch (Exception ex) {
		}

		// 窗體
		JFrame f = new JFrame("SwingWorker Sample");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// 表示區
		final 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("開始");
		f.add(BorderLayout.NORTH, b);

		// 結束按鈕
		JButton b2 = new JButton("結束");
		f.add(BorderLayout.AFTER_LINE_ENDS, b2);

		// SwingWorker類
		final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {

			/** 執行操做 */
			@Override
			protected Integer doInBackground() throws Exception {

				int sum = 0;

				if (!this.isCancelled()) {

					for (int i = 1; i <= 10; ++i) {
						sum += i;
						publish(new int[] { i, sum });// 調用表示中間結果
						setProgress(i * 10);// 進度條
						Thread.sleep(1000);
					}

				}
				return sum;
			}

			/** 表示中間結果 */
			@Override
			protected void process(List<int[]> chunks) {
				StringBuilder sb = new StringBuilder();
				for (int[] values : chunks) {
					sb.append(String.format("累加%d等於%d%n", values[0], values[1]));
				}
				taOutput.append(sb.toString());
			}

			/** 處理完成 */
			@Override
			protected void done() {

				if (this != null && !this.isDone()) {
					try {
						int result = get();
						taOutput.append("完了。 合計" + result + "\n");
					} catch (InterruptedException ex) {
					} catch (ExecutionException ex) {
					}
				}
			}

		};

		// 進度條表示
		sw.addPropertyChangeListener(new PropertyChangeListener() {
			@Override
			public void propertyChange(PropertyChangeEvent evt) {
				if ("progress".equals(evt.getPropertyName())) {
					progressBar.setValue((Integer) evt.getNewValue());
				}
			}
		});

		// 開始按鈕事件
		b.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				sw.execute();// 異步調用SwingWorkder
			}
		});

		// 結束按鈕
		b2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (sw != null && !sw.isDone()) {
					// Cancel
					sw.cancel(true);
				}

				JOptionPane.showMessageDialog(null, "結束!");
			}
		});

		// 窗體表示
		f.pack();
		f.setVisible(true);
	}
}
相關文章
相關標籤/搜索