來源自 這裡
Preface :
當我們開發 Swing 程式需要執行需耗時的工作時, 可以使用 worker thread (或稱為 background threads). 而這樣的 worker thread 可以使用類別 javax.swing.SwingWorker 來完成. 它是抽象類別, 要使用時可以繼承該類別, 並實作方法 doInBackground(), 並在裡面執行耗時工作.
Demo Code:
下面的範例代碼會建立一個 UI 如下:
點擊按鈕 "Start" 將會建立 NumberWorker 的物件, 它實作 javax.swing.SwingWorker, 接著會執行你實作方法 doInBackground() 的代碼, 而當背景程式正在執行時你可以任意移動該 UI, 甚至可以在 TextField 上面輸入字串; 而在你從該方法透出後, 方法 done() 會被執行:
而在背景程式 done() 方法中, 會將取得的 random number 設回原來 UI 的 TextField 並完成背景工作.
當你在點擊按鈕 "Start" 後, 按鈕 "Cancel" 將會被 enable. 當你點擊 "Cancel" 按鈕, 在 "Start" 按鈕點擊後建立的 NumberWorker 的物件上的方法 cancel(true) (繼承來自 SwingWorker 上面方法)將會被執行, 並同時終止正在背景執行的工作.
Implementation:
Supplement:
* The Java Tutorial > Worker Threads and SwingWorker
Preface :
當我們開發 Swing 程式需要執行需耗時的工作時, 可以使用 worker thread (或稱為 background threads). 而這樣的 worker thread 可以使用類別 javax.swing.SwingWorker 來完成. 它是抽象類別, 要使用時可以繼承該類別, 並實作方法 doInBackground(), 並在裡面執行耗時工作.
Demo Code:
下面的範例代碼會建立一個 UI 如下:
點擊按鈕 "Start" 將會建立 NumberWorker 的物件, 它實作 javax.swing.SwingWorker, 接著會執行你實作方法 doInBackground() 的代碼, 而當背景程式正在執行時你可以任意移動該 UI, 甚至可以在 TextField 上面輸入字串; 而在你從該方法透出後, 方法 done() 會被執行:
而在背景程式 done() 方法中, 會將取得的 random number 設回原來 UI 的 TextField 並完成背景工作.
當你在點擊按鈕 "Start" 後, 按鈕 "Cancel" 將會被 enable. 當你點擊 "Cancel" 按鈕, 在 "Start" 按鈕點擊後建立的 NumberWorker 的物件上的方法 cancel(true) (繼承來自 SwingWorker 上面方法)將會被執行, 並同時終止正在背景執行的工作.
Implementation:
- package swing.demo;
- import java.awt.BorderLayout;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.GridLayout;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.util.Random;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JPanel;
- import javax.swing.JTextField;
- import javax.swing.SwingUtilities;
- import javax.swing.SwingWorker;
- import javax.swing.WindowConstants;
- public class LuckyNumber extends JFrame implements ActionListener{
- private static final long serialVersionUID = 4276832367310733568L;
- private JLabel label;
- private JButton cancel;
- private JButton start;
- private SwingWorker worker;
- private JTextField textField;
- public LuckyNumber() {
- JPanel panel = new JPanel();
- panel.setLayout(new GridLayout(2, 1));
- JPanel buttons = new JPanel(new FlowLayout());
- start = new JButton("Start");
- start.addActionListener(this);
- start.setDefaultCapable(true);
- buttons.add(start);
- cancel = new JButton("Cancel");
- cancel.setEnabled(false);
- cancel.addActionListener(this);
- buttons.add(cancel);
- panel.add(buttons);
- ImageIcon image = new ImageIcon(getClass().getClassLoader().getResource("swing/demo/images/spinner.gif"));
- label = new JLabel(image);
- JPanel answer = new JPanel(new GridLayout(1, 2));
- textField = new JTextField("");
- answer.add(textField);
- answer.add(label);
- label.setVisible(false);
- panel.add(answer);
- setTitle("Lucky number generator");
- setPreferredSize(new Dimension(300, 100));
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(panel);
- }
- public static void main(String[] args) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- LuckyNumber luckyNumber = new LuckyNumber();
- luckyNumber.pack();
- luckyNumber.setVisible(true);
- luckyNumber.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- }
- });
- }
- public void actionPerformed(ActionEvent e) {
- if (e.getSource() == start) {
- start.setEnabled(false);
- textField.setText("");
- worker = new NumberWorker();
- worker.execute();
- label.setVisible(true);
- cancel.setEnabled(true);
- } else if (e.getSource() == cancel) {
- cancel();
- }
- }
- @Override
- public void dispose() {
- cancel();
- super.dispose();
- }
- private void cancel() {
- start.setEnabled(true);
- label.setVisible(false);
- cancel.setEnabled(false);
- if (worker != null) {
- worker.cancel(true);
- worker = null;
- }
- }
- private class NumberWorker extends SwingWorker
{ - private Random r = new Random();
- @Override
- protected String doInBackground() throws Exception {
- long s = System.currentTimeMillis();
- while (System.currentTimeMillis() - s < 5000 && !Thread.currentThread().isInterrupted()) {
- r.nextInt();
- }
- return String.valueOf(r.nextInt(10) + 1);
- }
- @Override
- protected void done() {
- try {
- textField.setText(get());
- LuckyNumber.this.worker = null;
- LuckyNumber.this.cancel();
- } catch (Exception ignore) {
- }
- }
- }
- }
* The Java Tutorial > Worker Threads and SwingWorker
沒有留言:
張貼留言