2016-07-27 9 views
0

私はこのロジックの流れを理解することができます。ボタンb1を押したときに何らかのアクションが実行されますが(何らかのステートメントが実行されます)、なぜ、以下のような構文が与えられたのですか?ActionEventオブジェクトaeが作成され、 ? Innerクラスを使用しない場合は、他の表現がありますか?ボタンが押されたときにタスクを実行するために、ActionEventの動作とそのオブジェクトの作成方法を教えてください。

JButton b1=new JButton(); 
b1.addActionListener((ActionEvent ae) -> { 
    //Statements; 
}); 
+0

「これに他の表現がありますか?」とはどういう意味ですか? – user3437460

+0

あなたはラムダ式とウェブ上の匿名のクラスを読む必要があります –

答えて

0

すべてのActionListenerには、機能を実装:

public void actionPerformed(ActionEvent e) { 
    ...//code that reacts to the action... 
} 

このコードは、ActionListenerを実装し、あなたが望むものは何でもするのactionPerformed機能を上書きする新しい匿名クラスを作成します。この機能を持つ新しいオブジェクトはActionListenerにの、fooの内部リストに追加されますのActionListenerのみ上書きする一つの機能を持っているので、コンパイラはどちらあなたを知っているよう

foo.addActionListener(new ActionListener() { 
    @Override public void actionPerformed(ActionEvent e) { 
     ...//code that reacts to the action... 
    } 
}); 

は、このための速記は、ラムダ式を使用することです(詳細については、ラムダのドキュメントを参照してください)意味:

foo.addActionListener( 
    (e) -> { 
     ...\code that reacts to the action... 
    } 
); 

アクションが発生した場合、fooはActionListenerのを通して方法を動作することは、それがリストされているオブジェクトを、それぞれ1上のactionPerformed()を呼び出します。各オブジェクトのバージョンの関数のコードが順番に実行されます。

ちなみに、actionPerformed()はSwingスレッドで実行され、ここでのパフォーマンスの低下は応答の遅いユーザーインターフェイスを意味するため、あまりにも多くの作業をactionPerformedで行わないことをお勧めします。アクションに応答して時間のかかるアクションを実行する必要がある場合は、この関数内で新しいスレッドを開始するか、単に既存のスレッドによって検出されるフラグを設定することを検討してください。

+0

非常にうまく説明されて、あなたのポイントを持って、そのような言葉に感謝します。 。 。 :) – Deepak

0

このようなアクションイベントを追加できます。 ActionListenerをimplentていることを確認してください:

JButton b1 = new JButton(); 
b1.addActionListener(this); 

あなたは

public void actionPerfomed(ActionEvent ae){ 
    if(ae.getSource()==b1){ 
     //your commands here 
    } 
} 

注このクラスを作成する必要があります。

関連する問題