0

私はJava Swingを勉強していますが、読んでいるこの簡単なコードチュートリアルに関連して疑問があります:

package com.andrea.execute;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/* An istance of a SimpleExample class is a JFrame object: a top level container */
public class SimpleExample extends JFrame {

    /* Create a new SimpleExample object (that is a JFrame object) and set some property */
    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                // Center the window on the screen. 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });
    }
}

ロジックは非常に単純です。JFrame Swing クラスを継承するSimpleExampleクラスがあります。したがって、SimpleExampleはトップレベルのコンテナーになります。

このクラスにはmain()メソッドも含まれていますが、今では 2 つの疑問があります。

1) main() メソッドでこのコードを実行する理由:

SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SimpleExample ex = new SimpleExample();
                ex.setVisible(true);
            }
        });

SwingUtilities クラスでinvokeLater()メソッドを呼び出し、新しい Runnable オブジェクトを渡します。

私が知っているドキュメントを読むと、アプリケーションを Swing Event Queue に配置する方法になります。すべての UI 更新が同時実行セーフであることを確認するために使用されます。

理解するのに問題があるのは、それがどのように実装されているかです。

invokeLater()メソッドの入力パラメーター内で、次の「もの」を渡します。

new Runnable() {
        @Override
        public void run() {
            SimpleExample ex = new SimpleExample();
            ex.setVisible(true);
        }
    });

これは何ですか?何を表す?そしてそれはどのように機能しますか?

TNX

アンドレア

4

3 に答える 3

4

Runnable インターフェイスを実装した無名クラスです。

次のような匿名クラスなしで使用できます。

class SimpleExample extends JFrame {

    public SimpleExample() {
        setTitle("Simple example");
        setSize(300, 200);
        setLocationRelativeTo(null);                
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new App());
    }
}

class App implements Runnable {

    public void run() {
        SimpleExample ex = new SimpleExample();
        ex.setVisible(true);
    }
}

しかし、匿名クラスの方が便利です。

于 2013-09-25T14:19:31.557 に答える
1

javax.swing.SwingUtilities#invokeLater(Runnable doRun)、イベント スレッドでの実行をスケジュールしjava.lang.Runnableます (任意のスレッドから呼び出し可能)。

于 2013-09-25T14:23:04.117 に答える
1

Runnable は、メソッド run を含むインターフェースです。invokeLater は、swing スレッドから渡された run メソッドを呼び出すために、runnable のこの実装を必要とします。

より良い情報を得るには、このリンクを参照してください http://en.wikibooks.org/wiki/Java_Programming/Threads_and_Runnables

于 2013-09-25T14:17:39.377 に答える