2011-01-21 4 views
7

현재 스윙을 배우고 있으며 일반적으로 GUI 개발에 익숙하지 않습니다. 테스트 응용 프로그램에서는 단일 이벤트 소스에 대해 여러 이벤트 목록 작성자가 있으며이 이벤트 리스너 중 먼저 어느 것이 먼저 실행되는지 궁금합니다.단일 스레딩 환경에서 단일 이벤트 소스에 대한 Java Swing 다중 이벤트 리스너

또 하나의 이벤트 소스에 대해 여러 개의 리스너가있는 경우 단일 스레드 환경에서 Swing 이벤트 처리가 어떻게 작동하는지 궁금합니다.

마지막으로 스윙에서 여러 스레드를 사용해야하는 일반적인 경우에 대해 알고 싶습니다.

감사합니다!

답변

12

귀하의 모든 질문에 3 가지 답변을 드리겠습니다. 우선, 화재가 지정된 순서가 지정되지 않습니다. 사람들은 그들이 발사 할 특정 명령을 결코 받아서는 안됩니다. 특정 순서로 수행 할 작업이 필요한 경우 동일한 ActionListener에 넣으십시오.

스윙을 프로그래밍 할 때는 거의 항상 멀티 스레드 환경에있게됩니다. Event Dispatch Thread (EDT)라는 스레드가 있습니다. 이것은 모든 이벤트를 처리하는 스레드입니다. 다른 처리는 다른 스레드에서 수행해야합니다. 그렇지 않으면 스윙 GUI가 응답하지 않을 수 있습니다.

스윙에서 여러 스레드를 사용하는 일반적인 경우는 오랜 시간이 걸리는 일부 처리를해야하는 경우입니다. (강렬한 계산, IO, 데이터베이스 연결) EDT와는 별도의 스레드에서 열심히하고 싶을 것이다. 그러면 GUI가 응답을 유지할 것입니다.

오라클 네트워크에는 Swing의 동시성에 대한 훌륭한 자습서가 있습니다. check it out 님을 추천합니다. 스레드의 다음과 같은 종류의

스윙 프로그래머 거래 :

  • 초기 스레드, 초기 응용 프로그램 코드를 실행 스레드.
  • 모든 이벤트 처리 코드가 실행되는 이벤트 발송 스레드입니다. Swing 프레임 워크와 상호 작용하는 대부분의 코드는이 스레드에서 실행되어야합니다.
  • 시간이 많이 걸리는 백그라운드 작업이 실행되는 백그라운드 스레드라고도하는 작업자 스레드.

스윙의 모든 멀티 스레딩 질문에 대한 표준 대답은 SwingWorker를 사용하는 것입니다. EDT와 별도의 스레드에서 백그라운드 작업을 쉽게 조정할 수 있습니다. 늘 그렇듯이 Oracle은 great tutorial on how to use SwingWorker입니다.

+1

나는 SwingWorker에 대한 직접적인 언급을 놓치지 만, 그렇지 않다면 매우 좋은 대답이다. – extraneon

+0

@extraneon : yes'SwingWorker'는 스윙에서 멀티 스레딩에 대한 정식 답입니다. 나는 그 끝에 짧은 소리를 추가 할 것이다. – jjnguy

+2

디자인의 관점에서, 설정되어있는 순서로 실행할 수있는 다른 ActionListener (또는 다른 클래스)를 등록 할 수있는 ActionListener를 작성할 수 있습니다. – extraneon