JAVA GUI 닫 기 버튼 이 작 동 하지 않 습 니 다(SwingWorker 로 해결)

2858 단어 SwingWorker
최근 에 두 개의 GUI 애플 릿 을 썼 는데 모두 파일 을 쓰 는 것 과 관련 이 있다.하지만 프로그램 이 실 행 될 때마다 닫 기 버튼 이 작 동 하지 않 는 다 는 사실 이 밝 혀 졌 다.'스 택 폭발'사이트 와 CSDN 에 글 을 올 렸 습 니 다.스 택 폭발 이 제 시 된 이 유 는 다음 과 같 습 니 다.번역 할 것 이 있 으 면 메 시 지 를 남 겨 주세요.
  
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()에 쓴 후에 프로그램 이 실행 되면 닫 기 단 추 를 누 를 수 있 고 스 레 드 가 더 이상 막 히 지 않 습 니 다.

좋은 웹페이지 즐겨찾기