2009-01-15 46 views
7

我目前的应用程序有一个JFrame,其中约15个动作存储为JFrame中的字段。每个动作都是匿名类,其中一些动作很长。在Swing应用程序中组织操作?

将行为分解为他们自己的类中可能存在一个名为actions的子包中是否很常见?

如果没有,这个复杂性通常会被驯服吗?

谢谢

回答

8

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

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

通常,不直接实例化它们也是有意义的,而是有一些管理器定义常量并初始化并返回一组操作,以便您可以在不同版本中提供不同的操作集,或者仅为内部版本设置某些操作。

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

+0

我认为也许作为替代或除了ActionManager,行动是很好的候选人注入视图,例如使用Spring。 – ktulinho 2012-01-19 17:20:37

4

这通常是我怎么做的。每个动作都有它自己的类,它具有对“应用”对象的引用,因此它可以获取它所需的资源。我通常有一个行动经理,负责所有的行动,所以有一个地方可以访问他们,以及一个地方更新他们的支持和东西。

最终,这也变得难以管理,您应该开始考虑使用诸如Eclipse RCP,NetBeans框架,JIDE等应用程序框架。如果您想要支持用户定义的键盘映射和类似的东西。

2

我所做的是为操作类创建一个包(实际上是包),然后根据上下文实例化每个类。几乎我所有的动作类都是抽象的抽象方法来获取上下文(ala 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); 
    } 
}); 
//... 

(抱歉有任何错误,我在此文本框中手动编写,而不是在IDE中)。