SwingWorker

5315 단어 Java
SwingWorker
App.java:
import javax.swing.SwingUtilities;


public class App {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                new MainFrame("SwingWorker Demo");
            }
        });
    }

}

MainFrame.java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;

public class MainFrame extends JFrame {

    private JLabel countLabel1 = new JLabel("0");
    private JLabel statusLabel = new JLabel("Task not completed.");
    private JButton startButton = new JButton("Start");

    public MainFrame(String title) {
        super(title);

        setLayout(new GridBagLayout());

        GridBagConstraints gc = new GridBagConstraints();

        gc.fill = GridBagConstraints.NONE;

        gc.gridx = 0;
        gc.gridy = 0;
        gc.weightx = 1;
        gc.weighty = 1;
        add(countLabel1, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        gc.weightx = 1;
        gc.weighty = 1;
        add(statusLabel, gc);

        gc.gridx = 0;
        gc.gridy = 2;
        gc.weightx = 1;
        gc.weighty = 1;
        add(startButton, gc);

        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                start();
            }
        });

        setSize(200, 400);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void start() {
        
        // Use SwingWorker and return null from doInBackground if
        // you don't want any final result and you don't want to update the GUI
        // as the thread goes along.
        // First argument is the thread result, returned when processing finished.
        // Second argument is the value to update the GUI with via publish() and process()
        SwingWorker worker = new SwingWorker() {

            @Override
            /*
             * Note: do not update the GUI from within doInBackground.
             */
            protected Boolean doInBackground() throws Exception {
                
                // Simulate useful work
                for(int i=0; i<30; i++) {
                    Thread.sleep(100);
                    System.out.println("Hello: " + i);
                    
                    // optional: use publish to send values to process(), which
                    // you can then use to update the GUI.
                    publish(i);
                }
                
                return false;
            }

            @Override
            // This will be called if you call publish() from doInBackground()
            // Can safely update the GUI here.
            protected void process(List chunks) {
                Integer value = chunks.get(chunks.size() - 1);
                
                countLabel1.setText("Current value: " + value);
            }

            @Override
            // This is called when the thread finishes.
            // Can safely update GUI here.
            protected void done() {
                
                try {
                    Boolean status = get();
                    statusLabel.setText("Completed with status: " + status);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            
        };
        
        worker.execute();
    }
}

SwingWorker 의 첫 번 째 template argument: doInBackground 방법의 반환 형식, get 방법의 반환 값 형식
template argument 에 서 는 Void (void 에 대응 하 는 클래스) 만 사용 할 수 있 습 니 다.Void 를 사용 하면 doInBackground 방법 은 null 로 돌아 가 야 합 니 다.
template argument 에 서 는 class 만 사용 할 수 있 고 primitive type 을 사용 할 수 없습니다.
SwingWorker 의 두 번 째 template argument: publish 방법의 매개 변수 유형, process 방법 매개 변수 List 의 일반적인 유형.doInBackground 방법 을 실행 하 는 동시에 update GUI 는 doInBackground 방법 에서 publish 방법 을 호출 한 다음 override process 방법 을 사용 합 니 다.
process 방법의 매개 변 수 는 List 입 니 다. doInBackground 방법 에서 Publish 를 호출 할 때마다 process 방법 이 호출 되 는 것 은 아니 기 때 문 입 니 다.이 List 는 매번 publish 의 내용 을 저장 합 니 다.process 방법 에 서 는 GUI safely 를 업데이트 할 수 있 습 니 다.process 방법 은 EDT 에서 배 치 됩 니 다.
모든 SwingWorker 대상 은 execute 한 번 만 가능 하 며, 다시 실행 해 야 한다 면 대상 을 다시 만 들 수 있 습 니 다.
doInBackground 방법 중 update GUI 가 안전 하지 않 습 니 다.doInBackground 방법 은 exception 을 throw 할 수 있 습 니 다.done 방법 중 catch 가 가능 합 니 다.
done 방법 은 이 thread 가 끝 날 때 실 행 됩 니 다. done 방법 에 서 는 GUI safely 를 업데이트 할 수 있 습 니 다.
get 방법 은 doInBackground 방법의 반환 값 을 얻 습 니 다. 만약 doInBackground 가 아직 실행 되 지 않 았 다 면 get 방법 wait.

좋은 웹페이지 즐겨찾기