2009-07-30 9 views
6

そこにスイングの指導者に叫ぶ!アクションコマンドとアクションクラス

私は数年前からSwingプログラミングを行ってきましたが、これはいつも不明です。

Swing/AWTでは、ボタンをクリックしたときに特定のアクションを実行する方法がいくつか用意されています。私はそれが私が取り組んだアプリケーションでいくつかの異なる方法を行ったことを見てきました。私は現在働いているプロジェクトでは、このアプローチに従う傾向:

someButton.setActionCommand("mycommand"); 
someButton.addActionListener(listener); 

--snip--

public void actionPerformed(ActionEvent event) { 
    String command = event.getActionCommand(); 
    if (command.equals("mycommand")) 
     doThis(); 
    else if (command.equals("someothercommand")) 
     doThat(); 
etc. 

これは一種の不格好な私には思える - プログラミングのこのスタイルにどんな利点がありますスイングActionを使用する方が良いですか?

さまざまなアプローチが異なる場合がありますか?

+0

どちらか適切な時期を判断するために慎重に判断する必要があると思います。私はそこに何らかの正誤があるとは思わないが、それはプログラマが個人的な好みを持っている多くのものの1つに過ぎないが、同じことをする複数のボタンがあれば、リスナー! – Andy

答えて

4

IMOの場合、アクション用に別々のリスナーを使用することをお勧めします。

このようにして、スウィングまでどのようなアクションを起こすべきかを委任されたままにしておきます。何をすべきかを決めるために文字列を比較する必要はありません。

複数のアクションに対して1つの巨大なActionListenerを持つことは、パターンを壊すように感じます。

+1

さらに、アクションリスナー内のコードを大きくすることも、委任を内部的に保持することもできます。私は、コマンド要素を使用する主な理由は、同じコンポーネントからアクションを引き起こす可能性のある異なるコマンドがある場合だと考えています。しかし、私の頭の上からは、Swing/AWTに固有のものは考えられません。 – aperkins

3

デザインの観点からは、「すべてのコンポーネントのすべてをここで処理できるようにする」タイプのデザインではなく、1つのクラスに対して1つの特定のアクションを処理するクラスを持つ方がよいと思います。

また、Actionを使用する場合は、a)複数のコンポーネント(ボタンやメニューアイテムなど)に適用することができます。b)setEnableを呼び出して、接続されているすべてのコンポーネントを有効/無効にします。 (すなわち、テキストラベル、ツールヒントのテキスト、アクセラレータキー、アイコンなど)を定義することができます。この最後のメソッドはputValueメソッドを介して行われ、このメソッドを再度呼び出すと、そのコンポーネントが接続されているすべてのコンポーネントの設定が変更されます。

具体的には、AbstractActionのサブクラス化をお勧めします。

0

そのあなたが同じアクションを実行するいくつかのボタンまたはコンポーネントを持っている場合(つまり同じページに複数の終了ボタンは同じコードを使用します)

が同じアクションコマンドにそれらすべてを設定し、彼らはすべての意志便利

JButton.addActionListener(this); 
JButton2.addActionListener(this); 
JButton.setActionCommand("exit"); 
JButton2.setActionCommand("exit"); 

public void ActionPerformed(ActionEvent e){ 
    if(e.getActionCommand=="exit") 
     System.exit(0); 
} 
+0

いいえ、同じアクションを実行する場合は、同じアクションリスナーを指定します。コマンド文字列は必要ありません。 – jjnguy

+0

これはまだ教えてもらえて、ありがたいことです。 – Brandon

+0

有用ですが、両方のコンポーネントにリスナーを与える方が良いでしょう。 – jjnguy

1

にリスナーに同じコードを使用し、私はそれがデモコードを知っているが、あなたはこのようなものに取り組んでいるので、私は、私はスイングが注意しないなら、本当に反復する傾向があることを言及しようと思いました。

アクションクラスを使用すると、リファクタリングを改善できます。スイングでは、開始する最善の方法の1つは、NO文字列がコード内にあることを確認することです。ほぼすべての「新規」は何らかの形でループしていて、データセットから読み込みます(しばしばデータセットは配列と同じくらい単純です)。そのようなデータセットから読み込みを始めると、アクションがあなたを大いに助けることができます。

データを使用してアクションを作成し、コントロールを作成するためのデータと、2つのデータを関連付けるデータを使用します。この方法で、新しいコントロールのコードの0行に非常に近くなることができます。

この方法でプログラミングを始めると、パターンを見ることができます。少なくとも繰り返しが速く、エラーが発生しにくいです。

関連する問題