가장 먼저 고려해야 할 것은 Swing 내부의 SwingWorkder 객체인데, 인터넷에서 기성품 예제를 찾기가 어렵기 때문에 주로 인터넷에 있는 정보를 참고해서 직접 정리했습니다.
참고: SwingWorkder 개체는 한 번만 실행할 수 있으며 반복적으로 실행할 수 없습니다! 예를 들어 시작을 클릭하면 종료되면 다시 시작할 수 없습니다.
다음과 같이 코드 코드를 복사합니다.
import java.awt.BorderLayout;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
java.util.List 가져오기;
import java.util.concurrent.ExecutionException;
import javax.swing.*;
import javax.swing.SwingWorker;
공개 클래스 SwingWorkerSample {
공개 정적 무효 메인(String[] args) {
//외관 정의
노력하다 {
UI관리자
.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (예외예외) {
}
// 형태
JFrame f = new JFrame("SwingWorker 샘플");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//표현 영역
final JTextArea taOutput = new JTextArea(15, 30);
JScrollPane sp = new JScrollPane(taOutput);
f.추가(sp);
// 하단 진행률 표시줄
final JProgressBar ProgressBar = new JProgressBar();
f.add(BorderLayout.SOUTH, ProgressBar);
// 시작 버튼
JButton b = new JButton("시작");
f.add(BorderLayout.NORTH, b);
// 종료 버튼
JButton b2 = new JButton("End");
f.add(BorderLayout.AFTER_LINE_ENDS, b2);
// SwingWorker 클래스
final SwingWorker<Integer, int[]> sw = new SwingWorker<Integer, int[]>() {
/** 작업 실행*/
@보수
protected Integer doInBackground()가 예외를 발생시킵니다.
정수 합계 = 0;
if (!this.isCancelled()) {
for (int i = 1; i <= 10; ++i) {
합계 += i;
게시(new int[] { i, sum });//중간 결과를 나타내기 위해 호출
setProgress(i * 10); // 진행률 표시줄
Thread.sleep(1000);
}
}
반환 금액;
}
/** 중간 결과를 나타냅니다*/
@보수
protected void process(List<int[]> 청크) {
StringBuilder sb = new StringBuilder();
for (int[] 값 : 청크) {
sb.append(String.format("누적된 %d는 %d%n과 같습니다.", 값[0], 값[1]));
}
taOutput.append(sb.toString());
}
/** 처리 완료*/
@보수
보호된 무효 완료() {
if (this != null && !this.isDone()) {
노력하다 {
int 결과 = get();
taOutput.append("완료. 합계" + 결과 + "/n");
} catch (InterruptedException ex) {
} catch (ExecutionException ex) {
}
}
}
};
// 진행률 표시줄 표현
sw.addPropertyChangeListener(새 PropertyChangeListener() {
@보수
공공 무효 propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
ProgressBar.setValue((Integer) evt.getNewValue());
}
}
});
//시작버튼 이벤트
b.addActionListener(새 ActionListener() {
@보수
공공 무효 actionPerformed(ActionEvent e) {
sw.execute();//SwingWorkder를 비동기적으로 호출합니다.
}
});
// 종료 버튼
b2.addActionListener(새 ActionListener() {
@보수
공공 무효 actionPerformed(ActionEvent e) {
if (sw != null && !sw.isDone()) {
// 취소
sw.cancel(true);
}
JOptionPane.showMessageDialog(null, "종료!");
}
});
// 형태 표현
f.팩();
f.setVisible(true);
}
}