如何从其他Actions调用Actions? (如果那是明智的话)

时间:2010-02-05 08:46:21

标签: java swing action actionlistener

我即将重构一个Swing应用程序,从使用ActionListeners到Action类,因为我意识到我的很多菜单项也会在工具栏中使用。

现在我有一个名为ImportExport的类,它处理底层模型的状态,然后显示相应的用户对话框。 ImportExport具有save()saveAs()open()功能。当用户单击“打开”菜单项时,操作侦听器调用open()open()首先检查模型是否有更改,如果是,则显示一个对话框,询问用户是否要保存第一。现在,如果用户点击“是”open(),则调用save(),再次执行一些检查并显示用户对话框。 save()非常持久:退出此操作的唯一方法是成功保存或用户决定要取消。我非常依赖save()提供的反馈,如果用户想要取消,我也会取消调用open()功能。

我想将ImportExport课分为三个班级(OpenActionSaveActionSaveAsAction),每个班级都将AbstractAction作为子类,最终摆脱ImportExport类。这就是我的问题出现的地方:如果用户想要在打开另一个模型之前保存模型,如何告诉SaveAction执行?如果用户决定取消,我该如何获得反馈?

这甚至是正确的方法吗?我不喜欢在保存和打开操作中有重复的代码,并且我已经将尽可能多的功能放入我的底层模型中,但是用户对话框在那里是不合适的,所以这是没有选择的。 Action设计是为了保留这种功能,或者只是保留我的ImportExport类,只需将所有动作调用委托给ImportExport中的相应函数。你如何使用Actions

2 个答案:

答案 0 :(得分:2)

当涉及决策树时,我有时会添加“控制器”操作。 OpenAction,SaveAction和SaveAsAction将子类化此控制器Action。控制器操作将确定模型的状态,并在适当时从用户请求更多信息,然后调用正确的子类。

答案 1 :(得分:1)

我会创建一个ImportExportController类,使用以下方法:open, save, saveAs。该控制器将了解业务逻辑。

我的Action类不会包含很多业务逻辑。他们只会打电话给控制器。

但这些操作将包含必须显示在JButtonJMenuItem等所有标签,图标,加速器......

对我来说,Actions是面向GUI的类,为方便起见(它们非常方便!),但没有专用于处理业务逻辑的类。