有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

使用表示操作的类文件:

public class xxxxxxxAction extends AbstractAction {
}

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

有没有一个好办法把这些课程组织成连贯的结构


共 (3) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    I'm just feeling the strain of converting ~60 ActionListeners into separate classes.

    只有您可以决定60是否最小。这个example使用一个类的四个实例^如果分组为一系列static factory methods,则here就是一个很好的例子。引用的例子here使用嵌套类JHotDraw,引用here,动态生成合适的操作

  3. # 3 楼答案

    你可以把你的行为放在一个单独的包里,把它们隔离开来。有时,将它们保存在一个类中是很有用的,尤其是当动作相关或有共同的父项时,例如:

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