2010-08-22 3 views
16

이 메서드를 사용하면 runnable 매개 변수가 시스템 EventQueue에 제출된다는 것을 알고 있습니다. 하지만이 방법을 사용하여 모든 GUI 업데이트를 수행해야합니까? 나는이 방법을 사용하는 경우는Java 데스크톱 응용 프로그램에서 GUI 업데이트에 EventQueue.invokeLater를 사용해야합니까?

java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
     jButton1.setText("changed text"); 
     } 
}); 

이 어떤 패턴을 우리는이 반복적 인 코드를 방지하기 위해 사용할 수 있습니다 난 내가 말을하는 JButton의 텍스트를 변경하려는 경우, 나는 이런 식으로 뭔가를 사용해야 뜻?

+0

참고 : 응답 속도가 느린 코드는 계속 응답해야합니다. –

+4

@nash 아래 답변 중 하나라도 질문에 대한 답변이있는 경우 대답으로 표시 할 수 있습니까? –

답변

27

UI 스레드 (이벤트 발송 스레드)가 아닌 다른 스레드에서 UI를 업데이트하려면 invokeLater 만 사용해야합니다.

버튼 클릭을위한 핸들러가 있고 누군가가 버튼을 클릭 할 때 라벨의 텍스트를 변경한다고 가정하십시오. 그런 다음 라벨 텍스트를 직접 설정하는 것이 좋습니다. 버튼 클릭 이벤트의 핸들러가 UI 스레드에서 실행되기 때문에 가능합니다.

다른 버튼을 클릭 할 때 다른 스레드가 시작되고이 작업이 끝나면 UI를 업데이트하려고한다고 가정합니다. 그런 다음 invokeLater을 사용합니다. 이 메서드는 UI 업데이트가 UI 스레드에서 실행되도록합니다.

많은 경우에 invokeLater이 필요하지 않으므로 간단히 UI 업데이트를 직접 수행 할 수 있습니다. 확실하지 않은 경우 isDispatchThread을 사용하여 현재 코드가 이벤트 발송 스레드 내에서 실행 중인지 확인할 수 있습니다.

+0

잘 모르겠다면 EventQueue.isDispatchThread() 메서드를 사용하여 현재 스레드가 이벤트 발송 스레드인지 확인할 수 있습니다. 권리? – nash

+1

맞습니다. 내 대답에이 방법에 대한 정보를 추가했습니다. –

+0

그러나 아직 지름길은 없습니까? 위의 상용구에 대한 바로 가기 또는 매크로가 좋았을 것입니다 (isDispatchThread가 X 일 경우, 그렇지 않으면 X를 감싸고 보류합니다.). 델파이에서 온 것은 모든 것을'Sync (x (a, b, c))'라고 부르길 원하지만 자바 문법이 java 문법이라면'public void {}'물건은 불가피하다. C 스타일의 매크로가 작성되도록 설계된 Java를 쓰지 않기를 바랄 때가있다. –

2

이벤트 디스패치 스레드에없는 경우에만이 작업을 수행해야합니다. 주 스레드에서 새 스레드 또는 실행 된 코드를 시작한 경우가 아니라면 모든 코드가 이미 이벤트 디스패치 스레드에서 실행되어이 코드를 불필요하게 만들 수 있습니다. 예를 들어, 모든 UI 이벤트 핸들러는 이벤트 발송 스레드에서 호출되므로 거기에서 호출 된 코드에 대해 수행 할 필요가 없습니다.

1

"반복적 인"(Java 사람들은 아마도 많은 비밀이없는 읽을 수있는 코드라고 말할 것입니다) 대신 Eclipse의 템플릿 기능을 사용할 수 있습니다. 난은 (는) 다음과 같은 블록에 두 글자 "위원장"을 확대 설정 :

EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        // do something. 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

은 분명히이 파견 큐 디자인 만 권장하지 않습니다, 그것은 기본적으로 필요합니다. 이것은 아마도 람다를 메시지 대기열로 밀어 넣는 모든 언어에서 내가 본 가장 시끄러운 방법 일 것입니다. 하지만 거기에 있습니다. 이것은 자바입니다. 그리고 자바의 방어에서, 정확히 무슨 일이 일어나고 있는지 위에서 분명합니다. 나는 타이핑의 양을 다시 보내지 만, 내가 생각할 수있는 유일한 것은 그것이 C 전처리 기 매크로 인 것을 피할 것이고, 나는 자바 사람들이 매크로를 사용하는 것을 좋아하지 않을 것이라고 생각한다. 템플릿을 통한 코드 확장은 읽기 쉽고 지원 가능하며 어떠한 흑 마법도 포함되지 않습니다.

+0

P는 아니요, 사용하지 마십시오. try - catch - finally GUI를 빌드하거나 invokeLater :-)를 사용하지 마십시오. – mKorbel

+1

@mKorbel 왜 설명 할 수 있습니까? – varuog

+1

나는 체크 예외에 대한 선택의 여지가 없다고 생각합니다. –

관련 문제