Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Swing中组织我的行动?_Java_Swing_Actionlistener_Abstract Action - Fatal编程技术网

Java 如何在Swing中组织我的行动?

Java 如何在Swing中组织我的行动?,java,swing,actionlistener,abstract-action,Java,Swing,Actionlistener,Abstract Action,我目前正在替换我的匿名ActionListeners new ActionListener() { @Override public void actionPerformed(final ActionEvent event) { // ... } } 使用表示操作的类文件: public class xxxxxxxAction extends AbstractAction { } 但是,我的GUI能够执行很多操作(例如CreatePersonActio

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

new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent event) {
        // ...
    }
}
使用表示操作的类文件:

public class xxxxxxxAction extends AbstractAction {
}
但是,我的GUI能够执行很多操作(例如CreatePersonAction、RenamePersonAction、DeletePersonAction、SwapePleaction等)


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

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

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转换成单独类的压力

public class CreatePersonAction extends AbstractPersonAction {

  public CreatePersonAction(PersonController aController) {
    super(controller);
  }

  public void actionPerformed(ActionEvent ae) {
    getController().createPerson();
  }
}

只有您可以决定
60
是否为最小值。这使用单个类的四个实例
StyledEditorKit
就是一个很好的例子,如果将其分组为一系列。引用的示例使用嵌套类<代码>JHotDraw,引用,动态生成合适的操作。

首先,您应该为操作中使用的所有操作(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();
  }
}

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

请提供一些上下文;瞧。@trashgod你所说的上下文是什么意思?我只是感觉到了将~60个ActionListener转换成单独类的压力,我不确定是否有更好的方法在我的代码中组织操作。谢谢,这也是Aqua概述的-但是知道名称是
静态工厂方法
,这与其他答案的思路非常相似,但是,如果我可以只将控制器传递一次,而不是传递给我创建的每个动作(在我的程序启动时不必强制“初始化它”),这将非常有用。您还可以使用,它还允许您存储有关动作的属性,许多Swing组件都能够使用这些属性自行配置它们