最近在學習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); } }