3

現在、匿名の ActionListeners を置き換えています

new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent event) {
        // ...
    }
}

アクションを表すクラスファイル:

public class xxxxxxxAction extends AbstractAction {
}

ただし、私の GUI は多くのアクションを実行できます (例: CreatePersonAction、RenamePersonAction、DeletePersonAction、SwapPeopleAction など)。

これらのクラスをまとまりのある構造に編成する良い方法はありますか?

4

3 に答える 3

8

アクションを分離するために、アクションを別のパッケージに保持できます。場合によっては、特にアクションが関連している場合や、共通の親を持つ場合に、それらを 1 つのクラスに保持すると便利です。次に例を示します。

public class SomeActions {
    static class SomeActionX extends AbstractAction {
        @Override
        public void actionPerformed(ActionEvent e) {
        }
    }

    static class SomeActionY extends AbstractAction {
        @Override
        public void actionPerformed(ActionEvent e) {
        }
    }

    static class SomeActionZ extends AbstractAction {
        @Override
        public void actionPerformed(ActionEvent e) {
        }
    }
}

次に、それらにアクセスします。

JButton button = new JButton();
button.setAction(new SomeActions.SomeActionX());
于 2013-02-06T19:14:31.817 に答える
6

~60 個の ActionListeners を別々のクラスに変換するという負担を感じています。

60が最小かどうかを判断できるのはあなただけです。このでは、1 つのクラスの 4 つのインスタンスを使用しています。ここStyledEditorKitに見られるは、一連の静的ファクトリ メソッドとしてグループ化する場合の良い例です。ここで引用されている例では、ネストされたクラスが使用されています。ここで引用されているは、適切なアクションを動的に生成します。JHotDraw

于 2013-02-06T19:20:30.403 に答える
4

まず、アクションで使用されるすべての actionPerformed にパブリック メソッドを提供する必要があります (createPerson、removePerson など)。これらすべてのアクション メソッドは 1 つのクラスにある必要があります (私はそれを PersonController と呼びます)。次に、AbstractPersonAction を定義する必要があります。

public class AbstractPersonAction extends AbstractAction {
  private PersonController controller;

  public AbstractPersonAction(PersonController aController) {
    controller = aController;
  }

  protected PersonController getController() {
    return controller;
  }
}

これで、すべてのアクションを個別のクラスに抽出できます。

public class CreatePersonAction extends AbstractPersonAction {

  public CreatePersonAction(PersonController aController) {
    super(controller);
  }

  public void actionPerformed(ActionEvent ae) {
    getController().createPerson();
  }
}

これらのアクションは、外部クラスの一部にすることも、別の「アクション」パッケージに配置することもできます。

于 2013-02-06T19:33:05.487 に答える