5

この単純な問題は私を混乱させます。setVisibleフレームのプロパティを設定することにより、JAVAGUIアプリケーションを表示できますtrue。しかし、私がインターネットで見つけたほとんどすべての例では、同じことを行うために別のスレッドを使用しています。

彼らはこのようなことをします、

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
        new Frame().setvisible(true);  //just take the idea of this line
    }
});

2つの方法に違いはありませんでした。しかし、特別な理由があるに違いありません。それが、誰もがこれを行っている理由です。

誰かがそれを説明できますか..ありがとう!

4

6 に答える 6

9

この方法でアプリケーションを起動する主な理由は、Swingコンポーネントがスレッドセーフではないため、GUIがどのスレッドから開始するかを保証する必要があるためです。 Event Dispatching ThreadEDT)と呼ばれるスレッドです。これを行わないと、どのスレッドで開始されるかを確認できませんが、いくつかの親切なコメンテーターが指摘しているように、メインスレッドはEDTではないことが保証されています。

UIコンポーネントは、EDT内からのみ作成、アクセス、または変更する必要があります。そうしないと、予期しない動作(運が良ければ)や汚れた塗り直しが発生します。

私があなたが精通することを提案するいくつかのリソース:

また、ボイラープレートJavaデスクトップアプリJFrameがメインメソッドでEventQueue.invokeLaterを使用する理由を読むこともできます。

アップデート

これは私が見つけようとしていたブログです:P

これは基本的に、開始する前にEDTと同期することが重要である理由を説明しますmain。また、その理由に関する詳細の一部についても説明します。

また、多くの開発者がアプリケーションを開始するときにこの根本的な間違いを犯す理由についても説明します(基本的に、私たちはできると言われましたが、実際に許可されたことはありませんでした...悪い私たち)

于 2012-10-01T03:11:57.427 に答える
3

GUIで行うすべての変更は、イベントディスパッチスレッドで行う必要があるためです。これが、AWTSWINGが機能するための方法です。

これは、再描画が単一のスレッドで実行されるためです。これを使用invokeLaterすると、Swingのスレッドセーフの欠如によって問題が発生する可能性がなく、そのスレッドに管理させることができます。その構文を使用して、GUI要素を管理する適切なスレッドで実行される命令を委任します。

于 2012-10-01T03:13:10.447 に答える
3

Swingはスレッドセーフではないため、すべてのコンポーネントをEDTで初期化する必要があります。これにより、デッドロックなどの問題を防ぐことができます。

于 2012-10-01T03:13:47.887 に答える
3

Swingクラスはスレッドセーフではありません。それらに対するすべてのアクションが同じスレッド(イベントディスパッチスレッド、またはEDT)で実行されるという事実からのみ、スレッドの正確性が得られます。したがって、Swingオブジェクトを操作するときは常に、EDT上にある必要SwingUtilities.invokeLaterがあります。これはそのための良い方法です。

その呼び出しがなければ、setVisible(true)古いスレッドから呼び出したばかりの場合、スレッドセーフはFrameなく、そのメソッドのアクションさえ表示されない可能性があります。さらに悪いことに、はFrame一部のアクションしか見ることができず、内部の仮定と不変条件を破り、奇妙な動作、クラッシュ、またはデッドロックを引き起こしました。

于 2012-10-01T03:14:28.800 に答える
3

Swingメソッドを呼び出すほとんどすべての操作は、Swingイベントディスパッチスレッドで実行する必要があります。invokeLater()は、この不変条件が確実に成立するようにする方法です。これについて詳しくは、こちらをご覧ください。

また、.NET、MFCなどのフォームなど、他のほとんどのGUIツールキットについても同じことが言えます。

于 2012-10-01T03:16:30.350 に答える
1

Java guiフレームワークは、スレッドセーフを強化するための単一スレッドとして設計されています。この手法は、スレッド制限と呼ばれます。したがって、コンポーネントの作成、モデルの作成、イベントの送信などのGUI操作は、イベントディスパッチスレッド(EDT)で実行する必要があります。説明する方法は、EDTで操作をキューに入れる1つの方法です。

于 2012-10-02T01:38:15.010 に答える