首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java Swing应用程序中更新按钮状态

在Java Swing应用程序中更新按钮状态
EN

Stack Overflow用户
提问于 2011-02-19 17:09:56
回答 2查看 587关注 0票数 1

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

我尝试遵循一种MVC模式,通过控制器将底层TableModel与表和按钮UI分离。

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

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2011-02-19 19:23:15

根据我对MVC的理解,理论上:

  1. 控制器更新模型
  2. 视图读取模型并更新自身

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

  1. 控制器同步它们。当域数据更改(播放列表为空或不为空)时,控制器将更改推送到视图。在这种情况下,控制器更加复杂,并且同时依赖于域模型和Swing模型。此外,当您有一个域模型和多个视图(树和表显示相同的底层数据)时,此模型会变得复杂。
  2. 视图适用于域模型。当域模型数据更改时,Controller只是向View指示它应该自我更新。在这种情况下,视图依赖于域类,但控制器不依赖于Swing模型或视图,除非它请求更新。

如我所见,您实现了选项1。

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

票数 1
EN

Stack Overflow用户

发布于 2011-03-02 23:38:06

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5049904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档