1

私は、研究プロジェクトの一環としてある人によって開発された Java アプリケーションに取り組んでいます。主な方法は次のとおりです。

 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();
            }
        });

    }

さて、なぜイベントキューを使用する代わりに使用したのかわかりません

 public static void main(String[] args) {

        //the MAC stuff!!

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

EventQueueを使用する意味はありますか?

4

3 に答える 3

2

EventQueue.invokeLater()その Runnable を GUI スレッド (ディスパッチ スレッド) で実行します。ディスパッチ スレッドから GUI の更新を実行する必要があります。ただし、ここのコードからは、実際には必要ないと思います。バックグラウンド スレッドで実行している場合にのみ使用する必要があります (たとえば、イベントからのコールバック)。

于 2012-04-30T20:10:05.540 に答える
2

Swing (そして、正直に言うと、AWT) はスレッドに敵対的です。ほとんどの GUI ライブラリと同様に、これはスレッド セーフではなく、スレッド セーフであっても意味がありません。マイクロ同期は現実的ではありません。AppContextさらに悪いことに、AWT Event Dispatch Thread (EDT) で作業を実行するために、効果的に変更可能な静的 (実際には奇妙なアイデアを使用) を使用します。これは、「実現」前に GUI をセットアップした場合でも発生する可能性があります。

多分問題ないでしょう。場合によっては、おそらく JRE の更新後に、いくつかの問題が発生する可能性があります。おそらく、それは単にキャレットが場違いになるだけです。問題は、それを危険にさらすことを考えなければならないのか、それとも標準の Java スタイルの冗長なボイラープレートを平手打ちするだけなのかということです。

于 2012-04-30T22:24:24.133 に答える
2

プロパティは初期スレッドで設定する必要があり、GUI はイベント ディスパッチ スレッドで構築するようにスケジュールする必要があります。別のアプローチをここに示します

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();
        }
    });
}
于 2012-05-01T00:38:34.333 に答える