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

时间:2013-02-06 19:06:44

标签: java swing actionlistener abstract-action

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

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

表示操作的类文件:

public class xxxxxxxAction extends AbstractAction {
}

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

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

3 个答案:

答案 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 methodsStyledEditorKit就是一个很好的例子。引用的示例here使用嵌套类。引用hereJHotDraw会动态生成合适的动作。

答案 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”包中。