3

ActionListener の代わりに Action を使用することについての私の理解を明確にしたいと思います。

複数の JButton があり、それらがクリックされた場合にすべて同じ機能を実行する必要がある場合 (たとえば、ボタンが無効になります)、これには Action を使用する方が適切でしょうか?

もしそうなら、アクションの状態を無効に設定することで、ボタンの状態を変更できる (たとえば、無効にする) ことができるからですか?

これはactionListenerでは不可能ですか?

以下は、上記の例を示すコードです。

JButton[] button = new JButton[10];

for(int i = 0; i < 10; i++){
    button[i] = new JButton();
    Action buttonAction = new ButtonAction();
    button[i].setAction(buttonAction);  
}

class ButtonAction extends AbstractAction{
    public void actionPerformed(ActionEvent e){
        setEnabled(false);
    }
}

スティックの端が間違っていたらごめんなさい!

ありがとうございました!

4

2 に答える 2

5

Javadocによると:

Action インターフェイスは、複数のコントロールから同じ機能にアクセスできる場合に、ActionListener インターフェイスに便利な拡張機能を提供します。

ですから、これが事実であるというあなたの主張に同意します。

于 2012-11-06T21:20:44.580 に答える
3

AbstractAction を拡張すると、コード内のある時点で同じ方法で追加情報を追加できるようになります。

public class NewFileAction extends AbstractAction
{
 /**
   * 
   */
protected NewFileAction()
{
  super("NewFile");
  this.putValue(NAME, "New File");
  this.putValue(SHORT_DESCRIPTION, "New file");
  this.putValue(LONG_DESCRIPTION, "New file");
  this.putValue(SMALL_ICON,ImageIconFactory.getSmallImageIcon(ImageIconFactory.Option.SUN_New24));
}

同じ情報が、任意のボタン、MenuItem などに自動的に表示されます。

あなたの例についてのコメント: 通常、次のような多くのアクションを作成する必要はありません

Action buttonAction = new ButtonAction();

あなたのループで。通常、1 つの Action オブジェクトを持ち、それをすべての MenuItems、Buttons などで再利用します。これに対する典型的な例外は、コンストラクターに渡されたパラメーターでアクションの動作が変更された場合です。

Action buttonAction = new ButtonAction(loopCounter);

この場合、多くのアクション オブジェクトが役立つ場合があります。また、loopCounter がラベルなどに移動する場合もあります。

于 2012-11-06T21:46:30.253 に答える