0

我有一个关于如何在 Swing 中实现动作的家伙。

我的想法是为扩展 AbstractAction 的应用程序的每个操作创建一个类,这样我就可以在许多必须具有相同行为的组件中使用。所以我终于有了一些东西:

public class ActionExample extends AbstractAction {

    @Override
    public void actionPerformed(ActionEvent arg0) {

        System.out.println("Do something");

    }

}

好吧,现在当我想使用它时,我想到了三个选项:

public void makeUI1() {

    JButton btn = new JButton(new ActionExample("Do it"));

    JMenuItem mi = new JMenuItem(new ActionExample("Do it"));

}

public void makeUI2() {
    Action a = new ActionExample("Do it");
    JButton btn = new JButton(a);
    JMenuItem mi = new JMenuItem(a);
}

或者将其用作单例(也更改 ActionExample):

public void makeUI2() {

    JButton btn = new JButton(ActionExample.getInstance());
    JMenuItem mi = new JMenuItem(ActionExample.getInstance());
}

public class ActionExample extends AbstractAction {

    private static final ActionExample INSTANCE = new ActionExample("Do it");

    public static Action getInstance() {
        return INSTANCE;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {

        System.out.println("Do something");

    }

}

我的第一个意见是通过单例实例实现,但我在 oracle 教程中看到它在将其设置为组件之前创建了一个新实例,并且在我还看到许多代码为每个组件创建新实例,所以我不知道哪个更好以及为什么。

是否首选一种方法而不是另一种方法?

4

2 回答 2

1

多实例操作允许您在操作时保存数据以供进一步使用。

想象一下,您想添加撤消/重做功能。您需要保存为每个操作执行的操作。

在这种情况下,单例不提供任何优势。

于 2013-05-08T17:04:30.303 回答
0

我认为最好的办法是使用 MVC 模式。您的 AbstractAction 类是一个控制器。它负责提取模型(即:业务逻辑)使用所需的信息。模型/业务逻辑是你重用的部分,但控制器即使使用相同的业务逻辑也可能有很大的不同。

例如,您可能有一个需要向其中添加 KeyListener 的 JComponent。突然之间,您预先制作的 AbstractAction 变得毫无价值,因为它不能在这种情况下使用。但是,只要您在 KeyListener 中重用您在 AbstractAction 中使用的所有业务逻辑代码,您就做对了。

于 2013-05-08T17:04:00.017 回答