我已经基于播放列表的概念实现了一个基本的Swing GUI,作为更大的DJ音频混合应用程序的一部分(想想一个原始的虚拟DJ(!))。播放列表基本上由JTable组成,轨道可以是轨道,可以从JTree中拖放。包含该表的JPanel还包含一组按钮,用于保存,加载和删除播放列表以及加载播放器。这些按钮状态需要根据应用程序的当前状态进行更新(启用/禁用)(即加载播放列表?播放列表中是否有曲目?等等)
我正在尝试遵循MVC模式,通过控制器将基础TableModel与表和按钮UI分开。
我的问题是......处理按钮更新的最优雅/最有效的方法是什么?此时,对当前加载的播放列表文件的引用存储在控制器中,并且控制器确定播放列表是否为模型中的空。然后它向View发送两个布尔值(isEmpty,isLoaded),然后根据这些值确定要启用的按钮。这种方法看起来有点不合适,所以我欢迎任何建议。
谢谢!
答案 0 :(得分:1)
据我了解MVC,理论上:
实践中的问题是您的域模型(您的类)与Swing Model类不同。所以问题是谁在同步域和摇摆模型:Controller或View?
控制器同步它们。当域数据发生更改(播放列表为空或无)时,Controller会将更改推送到View。在这种情况下,Controller更复杂,并且依赖于域模型和Swing模型。当您有一个域模型和多个视图(树和表显示相同的基础数据)时,此模型也会变得复杂。
视图适应域模型。当域模型数据发生更改时,Controller只会指示View应该自行更新。在这种情况下,View依赖于域类,但Controller不依赖于Swing Model或View,除非它请求更新。
我看到你实施了选项1.
我个人使用选项2.控制器处理业务逻辑和域模型,View处理与域模型同步和构建视图层次结构。
答案 1 :(得分:1)
您可以使用侦听器和Actions更优雅地执行此操作。对每个按钮使用AbstractAction。 (您也可以将它们重复用于菜单项。)然后您可以启用/禁用操作,按钮将更新以匹配。如果将TableModelListener添加到表模型,则会通知所有更改,并可以对操作进行更新。
您不会创建自己的MVC。您将在Swing类中使用固有的MVC。