JAVA GUI 닫 기 버튼 이 작 동 하지 않 습 니 다(SwingWorker 로 해결)
2858 단어 SwingWorker
The EDT(Event Dispatch Thread) is responsible for (amongst other things) processing all the UI events that occur, including the request to close your window. But if you block this thread with time consuming tasks (like I/O, loops, Thread#sleep or any other blocking operation), then the EDT is unable to process any of the events accumulating in the queue.
In this case, you best bet would be to use a SwingWorker to off load the writing of the file to another thread. Check out Concurrency in Swing for more information
구체 적 인 것 은 제 가 파일 을 쓰 는 작업 이 button 의 listener 에서 촉발 되 었 기 때문에 파일 을 읽 는 작업 이 완료 되 지 않 았 을 때 스 레 드 가 막 혔 습 니 다.버튼 이 튕 겨 나 오지 않 는 것 을 볼 수 있다.그래서 닫 기 버튼 을 더 눌 러 도 돌아 오지 않 았 어 요.
구체 적 인 해결 방법 은 SwingWorker 클래스 를 계승 하여 doInBackground()방법 을 다시 쓰 고 시간 이 걸 리 는 파일 쓰기 작업 을 이 방법 에 쓰 는 것 입 니 다.그리고 button 의 listener 에서 SwingWorker 인 스 턴 스 를 만 들 고 execute()방법 을 호출 합 니 다.즉,우리 가 다시 쓴 doInBackground()방법 으로 호출 됩 니 다.
private class Task extends SwingWorker<Void, Void>{
@Override
protected Void doInBackground() throws Exception {
//
return null;
}
}
주 방법 은 다음 과 같다.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
View window = new View();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
시간 이 걸 리 는 동작 을 doInBackground()에 쓴 후에 프로그램 이 실행 되면 닫 기 단 추 를 누 를 수 있 고 스 레 드 가 더 이상 막 히 지 않 습 니 다.