我目前正在替换我的匿名ActionListeners
new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
// ...
}
}
表示操作的类文件:
public class xxxxxxxAction extends AbstractAction {
}
但是,我的GUI能够执行很多操作(例如CreatePersonAction,RenamePersonAction,DeletePersonAction,SwapPeopleAction等)。
有没有一种很好的方法可以将这些类组织成一个连贯的结构?
答案 0 :(得分: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());
答案 1 :(得分:6)
我只是感觉到将~60个ActionListeners转换为单独的类的压力。
只有您可以决定60
是否最小。此example使用单个类的四个实例。如果将here分组为static factory methods,StyledEditorKit
就是一个很好的例子。引用的示例here使用嵌套类。引用here的JHotDraw
会动态生成合适的动作。
答案 2 :(得分:4)
首先,您应该为您的操作中使用的所有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();
}
}
这些操作可以是外部类的一部分,也可以放在单独的“actions”包中。