0

我正在开发一个MVC Java Swing应用程序,它将为用户提供至少十几种不同的操作。其中一些操作将触发SwingWorker对象的执行,而其他操作则非常简单(或常见)。我从这里讨论的方法开始,但为了避免AbstractAction为任何“常见”操作定义类的实现,我对其进行了修改。这是我实施的解决方案:

Action枚举类定义了我的“常见”操作:

public enum Action {
//               label          mnemonic            modelObject  modelMethod
EXIT            ("Exit"     ,   KeyEvent.VK_E   ,   "SubModel", "openExitView")
,FLAG_1         ("Flag 1"   ,   KeyEvent.VK_1   ,   "Options",  "setFlag_1")
,FLAG_2         ("Flag 2"   ,   KeyEvent.VK_2   ,   "Options",  "setFlag_2")
,HELP           ("Help"     ,   KeyEvent.VK_L   ,   "SubModel", "openHelpView")
,ABOUT          ("About"    ,   KeyEvent.VK_A   ,   "SubModel", "openAboutView");

然后,在Controller类中,我添加了这个方法:

public AbstractAction getAction(final Action action) {

AbstractAction actionImpl = new AbstractAction(action.label) {
    {
        putValue(AbstractAction.MNEMONIC_KEY, action.mnemonic);
    }

    public void actionPerformed(ActionEvent e) {
        model.executeAction(action);
    }
}; 

return actionImpl;

}

所以我得到如下的动作(在控制器中)并将它们分配给目标 Swing 组件:

private AbstractAction exitAction = getAction(Action.EXIT);

private AbstractAction flag_1Action = getAction(Action.FLAG_1);
private AbstractAction flag_2Action = getAction(Action.FLAG_2);

private AbstractAction helpAction = getAction(Action.HELP);
private AbstractAction aboutAction = getAction(Action.ABOUT);

private AbstractAction complexAction = new ComplexAction("Complex");
...
    view.setExitAction(exitAction);
    view.setAboutAction(aboutAction);
    view.setHelpAction(helpAction);
    ...

whereComplexAction是 的完整实现AbstractAction,这只是枚举类中未列出的操作的管理示例(因为它不是“常见”操作),但值得自定义完整实现。

最后,模型中的“通用”executeAction方法负责将动作分派给特定的子模型类:

    public void executeAction(Action action) {

      Object obj = getModelInstance(action.modelObject);
      if (obj == null) return;

      Method method = null;
      try {
        method = obj.getClass().getMethod(action.modelMethod);
        ...

getModelInstance给定枚举中列出的模型类名的情况下,只需从模型工厂检索目标子模型对象的实例。

一切正常,但我不相信这种模式:这不是样板代码吗?是否有一些 J2EE 对象通过编写更少的代码来实现相同的结果?我觉得这是一个非常常见的模式,我觉得奇怪的是没有更好的方法来使用AbstractAction.

4

1 回答 1

1

创建一个包含. Action确切的公式取决于您的领域,但EditorKit可以作为示例。正如这里所建议的,具体的编辑器工具包“导出有用Action的类,这些类Document对文本组件通用的模型进行操作”。更多讨论可以在这里这里这里找到

于 2016-02-18T11:12:07.777 回答