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

您可以将您的操作保存在单独的包中以隔离它们。有时,将它们放在一个类中很有用,尤其是当动作相关或具有共同的父级时,例如:

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 个 ActionListener 转换为单独的类的压力。

只有您可以决定是否60是最小的。此示例使用单个类的四个实例。StyledEditorKit,在这里看到,是一个很好的例子,如果分组为一系列静态工厂方法此处引用的示例使用嵌套类。,在这里JHotDraw引用,动态生成合适的动作。

于 2013-02-06T19:20:30.403 回答
4

首先,您应该为您的操作中使用的所有 actionPerformed 提供公共方法(createPerson、removePerson 等)。所有这些操作方法都应该在一个类中(我称之为 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 回答