如何在Swing中组织我的动作?

我目前正在替换我的匿名ActionListeners

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

使用表示操作的类文件:

 public class xxxxxxxAction extends AbstractAction { } 

但是,我的GUI能够执行很多操作(例如CreatePersonAction,RenamePersonAction,DeletePersonAction,SwapPeopleAction等)。

有没有一种很好的方法将这些类组织成一个连贯的结构?

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

 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()); 

我只是感觉到将~60个ActionListeners转换为单独的类的压力。

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

首先,您应该为您的操作中使用的所有actionPerformed提供公共方法(createPerson,removePerson等)。 所有这些动作方法应该在一个类中(我称之为PersonController)。 比你需要定义你的AbstractPersonAction:

 public class AbstractPersonAction extends AbstractAction { private PersonController controller; public AbstractPersonAction(PersonController aController) { controller = aController; } protected PersonController getContrller() { return controller; } } 

现在,您可以将所有操作提取到单独的类中。

 public class CreatePersonAction extends AbstractPersonAction { public CreatePersonAction(PersonController aController) { super(controller); } public void actionPerformed(ActionEvent ae) { getController().createPerson(); } } 

这些操作可以是外部类的一部分,也可以放在单独的“操作”包中。