2017-06-21 6 views
0

EventQueue.invokeLater()は、Java Swingコンポーネントをスレッドセーフにするための関数であることを理解しています。 また、この関数の引数は、Runnableを実装したオブジェクトであることがわかります。 は、しかし、私はこの関数呼び出しの構文を理解することができません、すなわち、この呼び出し -Java.awt.EventQueue.invokeLater():構文を理解できません

ここ
EventQueue.invokeLater(()-> { 
     new Screen(); 
    }); 

、画面は()のJFrameを拡張するクラスです。

public class Screen extends JFrame 
{ 
    Screen() 
    {  
     setSize(1000, 1000); 
     JPanel j1 = new Board(); 
     j1.setBounds(0,0,500, 500); 
     JPanel j2 = new DiceModel(); 
     j2.setBounds(500, 0, 500, 500); 
     add(j1); 
     add(j2); 
     setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(()-> { 
      new Screen(); 
     }); 

    } 
} 

このコードは期待どおりに動作します。 ボードとDiceModelはJPanelを拡張するために定義した2つのクラスです。

呼び出し

​​

画面がタイプのRunnableの対象ではないことを予想されるエラーを示します。

私の質問は、invokeLater()の関数呼び出しの構文の意味は何ですか? Javaのような無名関数呼び出しですか?

+1

これは*ラムダ関数*です。質問はおそらく重複していますが、ターゲットを見つけることができません。 – chrylis

+0

ありがとう!私はそのような種類の投稿を探していたが、見つけられなかった。だから私は自分自身で質問した。今_λ関数_を見上げます。 – julianff

+0

Java 8以降では、ラムダ式を使用して1つのメソッドでインターフェースのオブジェクトを作成できます。インタフェース 'Runnable'はメソッド' run'を1つ持っているので、関数インタフェースであり、ラムダ式として使用することができます –

答えて

0

完全なSwing処理は、EDT(Event Dispatching Thread)というスレッドで行われます。したがって、このスレッド内で長時間にわたる計算を行う場合は、GUIをブロックします。

ここに行く方法は、別のスレッド内で計算を処理することです。そのため、GUIは応答性があります。最後に、EDT内で実行する必要のあるGUIの更新が必要です。今度はEventQueue.invokeLaterが動作します。 Swingsイベントリストの最後にイベント(あなたのRunnable)をポストし、以前のすべてのGUIイベントが処理された後に処理されます。

ここでもEventQueue.invokeAndWaitの使用が可能です。違いは、GUIが更新されるまで計算スレッドがブロックされていることです。したがって、これがEDTから使用されてはならないことは明らかです。

まだメインスレッドからJFrameを開始するJavaコードがあります。これにより問題が発生する可能性がありますが、スイングからは保護されません。最近のIDEのほとんどは、GUIを起動するためにこれを作成します。

public static void main(String args[]) { 
java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     new NewJFrame().setVisible(true); 
     } 
    }); 
} 
+0

ありがとう!しかし、私はすでにこれを知っていました。私はすでに質問に投稿しているので、関数呼び出しを理解できませんでした。私は今それを得る、それは_Lambda関数呼び出し_です。 – julianff

関連する問題