2012-04-30 4 views
1

연구 프로젝트의 일환으로 일부 사용자가 개발 한 Java 응용 프로그램을 작성 중입니다. 주요 방법은 다음과 같은 : 이벤트 큐를 사용하는 대신 단지 이벤트 대기열을 사용하여 main()에서 간단한 메소드 실행

public static void main(String[] args) { 

     //the MAC stuff!! 

     XX.getInstance();  //this line creates the UI and the event handlers 
    } 

EventQueue의를 사용하여 어떤 의미가 있습니까

를 사용하는 이유

public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       // Change the name of the application on a mac 
       System.setProperty("com.apple.mrj.application.apple.menu.about.name", 
         "XX"); 

       // Use the top of the screen for the menu on a mac 
       if(System.getProperty("mrj.version") != null) { 
        System.setProperty("apple.laf.useScreenMenuBar", "true"); 
       } 

       try { 
        // Use system look and feel 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

       } catch (Exception e) { 
        System.out.println("Cannot use system's look and feel; using Java's default instead"); 
       } 

       // Create a new instance of XX 
       XX.getInstance(); 
      } 
     }); 

    } 

을 이제 이해가 안 돼요?

답변

2

속성은 Initial Thread에 설정해야하며 이벤트 디스패치 스레드에서 GUI를 구성해야합니다. 대체 접근법은 here으로 표시됩니다.

public static void main(String[] args) { 
    // Change the name of the application on a mac 
    System.setProperty(
     "com.apple.mrj.application.apple.menu.about.name", "XX"); 
    // Use the top of the screen for the menu on a mac 
    if (System.getProperty("mrj.version") != null) { 
     System.setProperty("apple.laf.useScreenMenuBar", "true"); 
    } 

    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      // Create a new instance of XX 
      XX.getInstance(); 
     } 
    }); 
} 
2

EventQueue.invokeLater()은 GUI 스레드 (디스패치 스레드)에서 해당 Runnable을 실행합니다. 디스패치 스레드에서 GUI 업데이트를 실행해야합니다. 여기에서 귀하의 코드에서, 당신이 정말로 필요하다고 생각하지 않습니다, 당신은 백그라운드 스레드 (예 : 이벤트 콜백에서)에서 실행하는 경우에만 그것을 사용해야합니다.

2

스윙 (그리고 솔직히 말하면, AWT)은 실망 스럽습니다. 대다수의 GUI 라이브러리와 마찬가지로, thread-safe가 아니며, 마이크로 동기가 현실적이지 않은 것으로 이해할 수 없습니다. 더 나쁜 것은 AWT Event Dispatch Thread (EDT)에서 작업을 실행하기 위해 실제로 가변적 인 통계를 사용합니다 (실제로 이상한 AppContext 아이디어를 사용함). 이는 "실현"전에 GUI를 설정할 때도 발생할 수 있습니다.

아마 문제가되지 않을 것입니다. 어쩌면 JRE 업데이트 후에 아마도 일부 문제가 발생할 수 있습니다. 어쩌면 그냥 자리를 잃을 수도 있습니다. 문제는 그 위험에 대해 생각하거나 표준 Java 스타일의 자세한 상투적 인 상용구를 두드리는 것까지 생각하고 싶습니까?

+0

+1 위반은 쉽게 진단 할 수 있지만 예방하기 쉽습니다. 더 [여기] (http://stackoverflow.com/q/3643174/230513) 및 [여기] (http://stackoverflow.com/q/6445143/230513). – trashgod