Swing ウィンドウを作成するための次のアプローチの違いに興味があります。
- main() での java.awt.EventQueue.invokeLater() の使用。
- main() で SwingUtilities.invokeLater() を使用する;
- スレッドをまったく気にせず、単に JFrame サブクラスをインスタンス化し、Runnable 内にラップせずに main から setVisible(true) を呼び出します。これはとにかくうまくいくようです。
ありがとう。
SwingUtilities.invokeLater
を呼び出すだけEventQueue.invokeLater
です。後者は Java 1.2 で導入されました。その前に、Swing には EDT に入るためにウィンドウを再描画するハックがありました。java.awt.EventQueue
それがこのメソッドの論理的な場所であり、呼び出すのが賢明であることをお勧めします。しかし、Swing と AWT の関係はひどく混乱しています。
をサブクラス化する必要はほとんどなくJFrame
、一般的に悪い習慣です。しかし、悪い習慣はSwingの標準です。このようにマルチスレッドを実行すると、問題が発生する可能性がありますが、自分のマシンでは問題が解決する可能性があります。考えられる最悪のことは、EDT とメイン スレッドで少し初期化することです (しばらくの間、FindBugs (すべてのプログラムの) が単一のハードウェア スレッド マシンで起動するかどうかは 50/50 でした)。
スレッド化で心に留めておくべきことは、「うまくいくように見える」ということは、「すべての状況下で明らかにうまくいく」ということと同じではないということです。
基本的なルールは、イベント スレッドの外で Swing/manipulate コンポーネントを作成してはならず、アプリケーションのメイン スレッドは「イベント スレッドの外」にあるということです。したがって、アプリケーションの起動コードでは、invokeLater() でメイン ウィンドウを作成する必要があります。
Swing でプログラミングしている場合は、invokeLater() の SwingUtilities バージョンを使用します。現在の実装では機能的には一方が他方を呼び出すだけだと思いますが、これは将来変更される可能性があると思います。