swing
스윙 노동자와 EDT
수색…
통사론
공공 추상 클래스 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