수색…


통사론

  • 공공 추상 클래스 SwingWorker <T, V>

  • T -이 SwingWorker의 doInBackground 및 get 메소드에 의해 리턴 된 결과 형

  • V -이 SwingWorker의 Publish 및 Process 메소드에 의해 중간 결과를 실행하기 위해서 사용되는 형태

  • T doInBackground () - 오버라이드해야하는 추상 함수입니다. 반환 유형은 T입니다.

메인 및 이벤트 발송 스레드

다른 Java 프로그램과 마찬가지로 모든 스윙 프로그램은 main 메소드로 시작합니다. main 메소드는 메인 쓰레드에 의해 시작된다. 그러나 이벤트 발송 스레드 (또는 short : EDT)에서 스윙 구성 요소를 만들고 업데이트해야합니다. 메인 쓰레드와 EDT 사이의 다이나믹을 설명하기 위해이 Hello World를 살펴보십시오 ! 예.

주 스레드는 단지 창 생성을 EDT에 위임하는 데 사용됩니다. EDT가 아직 시작되지 않은 경우 SwingUtilities.invokeLater 대한 첫 번째 호출은 Swing 구성 요소를 처리하는 데 필요한 인프라를 설정합니다. 또한 EDT는 백그라운드에서 계속 활성화됩니다. 주 스레드는 EDT 설정을 시작한 직후에 죽게되지만 EDT는 사용자가 프로그램을 종료 할 때까지 활성 상태로 유지됩니다. 보이는 JFrame 인스턴스의 닫기 상자를 JFrame 을 수행 할 수 있습니다. 그러면 EDT가 종료되고 프로그램의 프로세스가 완전히 종료됩니다.

첫 번째 N 개의 짝수를 찾고 백그라운드에서 계산이 수행되는 JTextArea에 결과를 표시하십시오.

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {
    private final int numbersToFind;

    private final JTextArea textArea;

    PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
        this.numbersToFind = numbersToFind;
        this.textArea = textArea;
    }

    @Override
    public List<Integer> doInBackground() {
        final List<Integer> result = new ArrayList<>();
        boolean interrupted = false;
        for (int i = 0; !interrupted && (i < numbersToFind); i += 2) {
            interrupted = doIntenseComputing();
            result.add(i);
            publish(i); // sends data to process function
        }
        return result;
    }

    private boolean doIntenseComputing() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            return true;
        }
        return false;
    }

    @Override
    protected void process(List<Integer> chunks) {
        for (int number : chunks) {
            // the process method will be called on the EDT
            // thus UI elementes may be updated in here
            textArea.append(number + "\n");
        }
    }
}

public class SwingWorkerExample extends JFrame {
    private JTextArea textArea;

    public SwingWorkerExample() {
        super("Java SwingWorker Example");
        init();
    }

    private void init() {
        setSize(400, 400);
        setLayout(new GridLayout(1, 1));
        textArea = new JTextArea();
        add(textArea);

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
    }

    public static void main(String args[]) throws Exception {

        SwingWorkerExample ui = new SwingWorkerExample();
        EventQueue.invokeLater(() -> {
            ui.setVisible(true);
        });

        int n = 100;
        PrimeNumbersTask task = new PrimeNumbersTask(ui.textArea, n);
        task.execute(); // run async worker which will do long running task on a
        // different thread
        System.out.println(task.get());
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow