7

この単純なコードを理解するのに苦労しています:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
   public void run() {
      createAndShowGUI();
   }
});

誰かがそれがどのように機能するかを説明してもらえますか(私は初心者なので簡単に)?この短いコードは、この大きなコードの一部です。

具体的には、次の質問があります。

  1. 「public void run」は新しいメソッドを定義しますか? その場合、別のメソッド内で定義されているのはなぜですか (参照用に「より大きなコード」を参照してください)。
  2. 「public void run」が新しいメソッドを定義する場合、1 行のコード (createAndShowGUI) のみを含むメソッドを定義する理由は何ですか?
  3. 「invokeLater」は何をしますか? これは実際、私にとって最も複雑な質問です。

私は新参者であり、「特別な」「技術的な」言葉を使用すると、さらに多くの疑問が生じることをもう一度強調したいと思います。

あなたが私を助けることに決めたら、前もってありがとう!

4

5 に答える 5

11

私が与えることができる最短の答えは次のとおりです。

Runnableメソッドを定義する型を表すJavaのインターフェースrunです。このインターフェイスを実装するクラスは、 の実装を提供する必要がありますrunRunnableは、システムの他の部分によって実行されるタスクを表します。 Threadはよく知られていRunnableます。

のようなコードがある場合new InterfaceName() { //implementation }、それは匿名クラスと呼ばれます。匿名クラスのポイントは、インターフェイス型を実装する 1 回限りのクラスを作成することです。このクラスには名前がないため、二度と参照することはできません。ここでのみ使用されます。

Swingについてあまり知らなくてもSwingUtilities.invokeLater()、andを受け入れるように見えRunnableます...まあ、後で呼び出すと思います(JavaDocsにはおそらく後で説明されています)。ただし、ここで単に別のメソッド呼び出しとして定義する理由は、run内部の一部のコードがthis でメソッドをSwingUtilities呼び出すためです。実際、 any について知ることができるのは、 signature を使用してメソッドを定義することだけです。これは、インターフェイスで定義されている唯一のメソッドであるためです。runRunnableRunnablepublic void run()Runnable

まあ、結局は短すぎなかったと思います。

于 2010-01-30T13:31:57.567 に答える
6

これは匿名の内部クラスです。

次の 3 つのことを定義しています。

  • 新しいクラス
  • runそのクラス内で呼び出されるメソッド
  • そのクラスの新しいインスタンス

この例では、いくつかの操作 ( createAndShowGUI()) を Swing スレッドで実行する必要があります。メソッド呼び出しの途中で別のスレッドに「ジャンプ」することはできないため、代わりにオブジェクト (作成した新しいインスタンス) をキューに配置します。Swing スレッドの準備が整うと、そのオブジェクトがキューから削除され、runメソッドが呼び出されますcreateAndShowGUI。これで、すべてが正しいスレッドで発生します。

于 2010-01-30T13:28:12.053 に答える
2

これは Swing が通常 GUI を作成する方法ですが、「このように実行してください。理由は後で説明します」と言うだけです。詳細はやや複雑で、初心者には役に立たないため、それらは正しいと思います。とにかく:

invokeLaterRunnable後でクラスを実行するスレッドを起動します。実行可能なクラスは、finnw via で言及されているようにアドホックに作成され、インターフェイスに従ってメソッドをnew Runnable { [..] }指定する必要があります。この場合、メソッドを実行するだけです。public void run()RunnablecreateAndShowGUI

于 2010-01-30T13:36:59.800 に答える
1

このコードは、関数 (createAndShowGUI()) を別のスレッドで呼び出すようにします。スレッドが何かわからない場合は、それについて読んだ方がよいでしょうが、とにかく、他のコードが実行されると同時に実行されるコードと考えてください。他のコードは、この Invoke() 呼び出しに続く行になります。これはグラフィック アプリでは非常に一般的です。他のコードがユーザー アクションに応答している間に、コードが実行されてグラフィックが更新されます。とは言っても、私は InvokeLater() に関するドキュメントをわざわざ読んだことはなく、人生であまり Java を書いたこともありません。「LumpN」が言ったように、「これは通常、Swing が GUI を作成する方法です」。

(初心者にとって)奇妙なことは、invokeLater()パラメーターが匿名の方法で定義されていることです-「コード内」。このクラスはまったく新しいものではなく単純なので、これは実際には素晴らしいことです。他のすべての回答は、匿名のことを説明しています。

そう: 1.はい。2.理由を尋ね、技術的な詳細をあまり取得しないように求めました-しかし、「yulkes」が言ったように-Javaではメソッドをパラメーターとして渡すことができないため、このクラスを構築する必要があり、このように構築するのは素晴らしいことです. 3. 最初の段落で要約したことで、ドキュメントを簡単に読むことができ (Google で関数名を検索するだけです)、「Google コード検索」についても知ることができます。

于 2010-01-30T13:51:27.877 に答える
0

invokeLater を呼び出すと、Runnable タイプのインスタンスが渡されます。Runnable は「public void run()」というメソッドを 1 つだけ宣言するインターフェースです。短いコードの1行目で何が起こるかは、「匿名内部クラス」と呼ばれます.1回だけ使用されるRunnableのインスタンスを作成しています.名前を付けることさえありません.

InvokeLater は Runnable を受け取り、内部で次のようなことを行います

public static void invokeLater(Runnable r) {
    // Wait for the correct time to run this
    r.run()
}

これは、invokeLater がいつ run メソッドを呼び出すかを決定し、createAndShowGUI を実行することを意味します。

Java ではメソッドをパラメーターとして渡して実行することは (まだ) できないため、この使い捨ての Runnable インスタンスを作成する必要があります。

于 2010-01-30T13:32:36.733 に答える