Java 在Swing应用程序中组织操作?

Java 在Swing应用程序中组织操作?,java,swing,code-organization,Java,Swing,Code Organization,我当前的应用程序有一个JFrame,其中大约有15个操作存储为JFrame中的字段。每个动作都是一个匿名类,其中一些相当长 在名为actions的子包中,将actions分解为它们自己的类是否很常见 如果不是,这种复杂性通常是如何被驯服的 谢谢我通常就是这样做的。每个动作都有自己的类,该类引用了“app”对象,因此可以访问所需的资源。我通常有一个操作管理器,它保存所有的操作,所以有一个地方可以访问它们,也有一个地方可以更新它们的启用和内容 最终,这也变得难以管理,此时您应该开始考虑使用Eclip

我当前的应用程序有一个JFrame,其中大约有15个操作存储为JFrame中的字段。每个动作都是一个匿名类,其中一些相当长

在名为actions的子包中,将actions分解为它们自己的类是否很常见

如果不是,这种复杂性通常是如何被驯服的


谢谢

我通常就是这样做的。每个动作都有自己的类,该类引用了“app”对象,因此可以访问所需的资源。我通常有一个操作管理器,它保存所有的操作,所以有一个地方可以访问它们,也有一个地方可以更新它们的启用和内容


最终,这也变得难以管理,此时您应该开始考虑使用Eclipse RCP、NetBeans框架、JIDE等应用程序框架。如果您希望支持用户定义的键映射之类的东西,这一点尤其重要。

如果您的操作可以重用的话(例如,通过键盘快捷键、其他菜单、其他对话框等),尤其是如果它们可以直接在底层模型上工作(而不是在UI上),那么通常最好不要将它们作为匿名类

相反,创建一个单独的包,并为每个包创建类

通常,不直接实例化这些操作也是有意义的,而是使用某种类型的管理器来定义常量、初始化和返回操作集,例如,您可以在不同版本中提供不同的操作集,或者仅为内部版本设置某些操作


最后,检查您的操作是否可以重构为类层次结构。它们通常可以,这样可以节省代码复制,还可以帮助您增加健壮性(例如,在让操作执行之前检查某些条件)。

我所做的是创建一个包(实际上是包树)对于动作类,然后根据上下文实例化每个类。几乎我所有的动作类都是抽象的,使用抽象方法来获取上下文(ala Spring)


(对于任何错误,我都很抱歉,我是在这个文本框中手工编写的,而不是在IDE中)。

我认为,作为ActionManager的替代或补充,actions是在视图中注入的很好的候选者,例如Spring。
public abstract class CalcAndShowAction extends AbstractAction {
    //initialization code - setup icons, label, key shortcuts but not context.

    public void actionPerformed(ActionEvent e) {
        //abstract method since it needs ui context
        String data = getDataToCalc();

        //the actual action - implemented in this class, 
        //  along with any user interaction inherent to this action
        String result = calc(data);  

        //abstract method since it needs ui context
        putResultInUI(result);
    }
    //abstract methods, static helpers, etc...
}

//actual usage
//...
button.setAction(new CalcAndShowAction() {
    String getDataToCalc() {
        return textField.getText();
    }

    void putResultInUI(String result) {
        textField.setText(result);
    }
});
//...