2012-04-30 13 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ライブラリと同様に、スレッドセーフではなく、それが意味をなさない - マイクロ同期化は現実的ではありません。 AWT Event Dispatch Thread(EDT)で作業を実行するには、実際には可変統計を使用するのが悪いです(実際は奇妙なAppContextアイデアを使用します)。これは、「実現」の前にGUIを設定している場合でも発生します。

おそらくそれは問題ではありません。おそらく、おそらくJREの更新後には、いくつかの問題が生じるでしょう。多分、それはちょうどその場所のキャレットになるでしょう。問題は、それを危険にさらすことについて考える必要がありますか、あるいは標準的なJavaスタイルの冗長な定型文を叩くだけでいいのですか?

+0

+1違反は診断するのは難しいが、防止しやすい。詳細[ここ](http://stackoverflow.com/q/3643174/230513)と[ここ](http://stackoverflow.com/q/6445143/230513)。 – trashgod

関連する問題