2012-11-27 1 views
1

Java에서 GUI 예제 코드를보고 있었는데 GUI를 표시하는 적절한 방법이 무엇인지 궁금합니다. 일부 GUI에 대해 createAndShowGUI() 메소드가 작성되었다고 가정하십시오. Java GUI를 표시하려면 특별한 처리가 필요합니까?

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

이는 javax.swing의 물건이없는 main 메소드의 마지막에 createAndShowGUI()를 호출 단순히 잘못 될 것이다 : 나는 이런 식으로 뭔가를 보았다? 아니면 내 진짜 질문은 여기서 무슨 일이 일어나고 있는지에 관한 것입니다. 나는 스레드에 익숙하지만 GUI를 표시하는 데 새로운 스레드를 만드는 것이 왜 필요한지 잘 모르겠습니다.

+0

Swing 이벤트 스레드에서 GUI를 표시하는 조치를 취하는 것이 더 안전합니다. 메인 화면에 표시 할 수는 있지만 다시 문제가 발생할 수도 있습니다. –

+2

* "나는 스레드에 익숙하지만 GUI를 표시하는 데 새로운 스레드를 만드는 것이 왜 필요한지 잘 모르겠다."*이 코드는 '새로운 스레드를 만들지 않습니다' GUI의 구성이 Event Dispatch Thread에서 수행되는지 확인하십시오. –

답변

2

UI (Swing 또는 AWT)와의 모든 상호 작용은 이벤트 발송 스레드의 컨텍스트 내에서 실행되어야합니다.

스윙 (및 AWT) 구성 요소는 스레드로부터 안전하지 않으므로 EDT 이외의 스레드에서 해당 구성 요소를 변경하면 손상된 업데이트, 페인트 아티팩트, 데드락 및 VM 충돌이 발생할 수 있습니다. 또한 디버깅하기가 어렵다는 점도 악명 높습니다.

당신은 그것을가 실행되는 main 메소드가 실행됩니다

나는 또한 추가해야합니다,를 통해 읽기를하는 것 같아서 무엇을 그것에 대해 생성 된 VM을 항상 스레드하십시오. EDT가 필요하지 않을 때까지 시작되지 않기 때문에 EDT가 아니어도됩니다.

좋은 스윙 프로그램은 항상 EventQueue.invokeLater 같은 것으로 시작합니다. SwingUtilities.invokeLater을 사용할 수도 있지만 일반적으로 같은 것입니다.

1

GUI와 관련된 모든 것이 Event Dispatch Thread (EDT)을 통해 수행되어야하므로 Java가 인터페이스의 전체 그림을 관리하는 방법입니다. 기본적으로 메서드는 전달 된 Runnable 개체의 run() 메서드 실행을 올바른 스레드에 위임합니다. RunnableThread하지

마음, 그것은 무언가를하는 방법을 제공하는 단순한 인터페이스입니다 (따라서 클래스는 실행 가능한입니다). 그러나 스레드가 여기에 관련되어 있지 않다는 사실은 에서 Runnable으로 확장된다는 점은 스레드가 Runnable 개체이기 때문에 뭔가를 실행할 수 있다는 것입니다.

+0

설명해 주셔서 감사합니다. – CowZow