【发布时间】:2010-10-01 16:22:01
【问题描述】:
我当前的应用程序有一个 JFrame,其中大约 15 个动作存储为 JFrame 中的字段。每个动作都是一个匿名类,其中一些很长。
将动作分解成自己的类是否常见,可能在称为动作的子包中?
如果没有,这种复杂性通常是如何驯服的?
谢谢
【问题讨论】:
标签: java swing code-organization
我当前的应用程序有一个 JFrame,其中大约 15 个动作存储为 JFrame 中的字段。每个动作都是一个匿名类,其中一些很长。
将动作分解成自己的类是否常见,可能在称为动作的子包中?
如果没有,这种复杂性通常是如何驯服的?
谢谢
【问题讨论】:
标签: java swing code-organization
这就是我通常的做法。每个动作都有自己的类,该类具有对“app”对象的引用,因此它可以获取所需的资源。我通常有一个操作管理器来保存所有操作,因此有一个地方可以访问它们,也有一个地方可以更新它们的启用和内容。
最终这也变得难以管理,此时您应该开始考虑使用应用程序框架,如 Eclipse RCP、NetBeans 框架、JIDE 等。如果您想支持用户定义的键盘映射和类似的东西,尤其如此。
【讨论】:
如果您的操作可能是可重用的(例如,通过键盘快捷键、其他菜单、其他对话框等),特别是如果它们可以直接在底层模型(而不是 UI)上工作,那么它通常最好不要将它们作为匿名类。
相反,创建一个单独的包,并为每个包创建类。
通常,不直接实例化它们也很有意义,而是使用某种管理器来定义常量并初始化和返回动作集,这样您就可以在不同的版本或集合中提供不同的动作集某些操作仅适用于内部发布。
最后,检查您的操作是否可以重构为类层次结构。它们通常可以,这样可以节省代码复制,还可以帮助您增加稳健性(例如,在执行操作之前检查某些条件)。
【讨论】:
我所做的是为动作类创建一个包(实际上是包树),然后根据上下文实例化每个类。几乎我所有的动作类都是抽象的,带有抽象方法来获取上下文(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 中)。
【讨论】: