【问题标题】:Updating button states in a Java Swing application在 Java Swing 应用程序中更新按钮状态
【发布时间】:2011-02-19 09:09:56
【问题描述】:

我已经实现了一个基于播放列表概念的基本 Swing GUI,作为大型 DJ 音频混合应用程序的一部分(想想原始的虚拟 DJ(!))。播放列表基本上由一个 JTable 组成,其中的曲目可以是可以从 JTree 拖放的曲目。包含该表的 JPanel 还包含一组按钮,用于保存、加载和删除播放列表以及加载播放器。这些按钮状态需要根据应用程序的当前状态进行更新(启用/禁用)(即是否加载了播放列表?播放列表中是否有曲目?等)

我正在尝试遵循 MVC 模式,通过控制器将底层 TableModel 与表格和按钮 UI 分开。

我的问题是......处理按钮更新的最优雅/最有效的方式是什么?此时,对当前加载的播放列表文件的引用存储在控制器中,控制器从模型中确定播放列表是否为空。然后它将两个布尔值(isEmpty,isLoaded)发送到视图,然后视图根据这些值确定要启用哪些按钮。这种方法似乎有点不雅,所以我欢迎任何建议。

谢谢!

【问题讨论】:

    标签: java model-view-controller swing jtable jbutton


    【解决方案1】:

    据我了解 MVC,理论上:

    1. 控制器更新模型
    2. View 读取模型并自行更新

    实践中的问题是您的域模型(您的类)与 Swing 模型类不同。所以问题是谁在同步域模型和摇摆模型:控制器还是视图?

    1. 控制器同步它们。当域数据更改(播放列表为空或不为空)时,控制器将更改推送到视图。在这种情况下,Controller 更复杂,并且依赖于域模型和 Swing 模型。当您拥有一个域模型和多个视图(树和表显示相同的基础数据)时,此模型也会变得复杂。

    2. 视图适应域模型。当域模型数据发生变化时,Controller 只是简单地向 View 指示它应该更新自己。在这种情况下,View 依赖于域类,但 Controller 不依赖于 Swing Model 或 View,只是它请求更新。

    我看到你实施了选项 1。

    我个人会使用选项 2。控制器处理业务逻辑和域模型,视图处理同步到域模型和构建视图层次结构。

    【讨论】:

      【解决方案2】:

      您可以使用侦听器和操作更优雅地做到这一点。为每个按钮使用一个 AbstractAction。 (您也可以将它们重用于菜单项。)然后您可以启用/禁用该操作,按钮将更新以匹配。如果您将 TableModelListener 添加到表模型中,它将收到所有更改的通知,并且可以对操作进行更新。

      您不会创建自己的 MVC。您将在 Swing 类本身中使用固有的 MVC。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        相关资源
        最近更新 更多