And*_* II 11 java model-view-controller swing jlist
前段时间我问了这个问题.所有解决方案都是解决方法.
现在这不可能.我觉得这里出了点问题,但我不知道是不是Swing的MVC模型在概念上是错误的,或者我认为这在概念上是错误的.
这是问题了.我正在使用a JList来实现文档页面的缩略图列表.如果用户从列表中选择另一个缩略图,则加载该页面.要做到这一点,我添加了一个ListSelectionListener到JList,其选择更改时,它加载该页面.但是用户也可以使用其他控件更改页面.当然,我希望通过在此处选择该页面来将其反映在缩略图列表中.所以我setSelectedIndex()要更新了JList.不幸的是,这会产生不必要的影响,ListSelectionEvent这会导致监听器重新加载页面.
现在这里有什么问题?我只是从其他地方改变了模型,所以我自然希望视图自我更新,但我不希望它触发事件.Swing没有实现MVC吗?或者我在这里错过了一点?
这是我们很多Swing程序员必须面对的问题:多个控件修改相同的数据,然后更新反映在每个控件中.在某些时候,必须对将要应用于模型的更新进行最终否决:无论什么东西需要能够处理多个(可能是多余的甚至是相互矛盾的)更新并决定如何处理它们.这可能发生在模型层中,但理想情况下它应该是执行此操作的控制器 - 毕竟,这件事很可能是业务逻辑所在的位置.
在这方面,Swing的问题在于MVC的控制器部分经常在视图组件和模型之间分开,因此可能难以将该逻辑集中.在某种程度上,Action接口通过将逻辑放在一个位置并允许它由不同的组件共享来纠正actionPerformed()事件,但这对其他类型的事件没有帮助,或者当有多个不同的类时需要协调的事件.
那么,答案是遵循在Swing中暗示但未明确的模式:仅在状态实际发生变化时执行请求的更新,否则不执行任何操作.这样做的一个例子JList就是:如果你试图将a的选定索引设置为JList已经选择的相同索引,则不会发生任何事情.不会触发任何事件,也不会发生更新:有效地忽略更新请求.这是一件好事.这意味着你可以,例如,你有一个监听器JList,它将响应一个新选择的项目,然后反过来要求JList重新选择相同的项目,你不会陷入病态递归循环.如果应用程序中的所有模型控制器都执行此操作,那么在整个地方触发多个重复事件都没有问题 - 每个组件只会在需要时更新自身(并随后触发事件),如果它确实更新然后它可以触发它想要的所有更新事件,但只有那些尚未收到消息的组件才会对它做任何事情.
这是预期的行为.
在事件驱动的系统中,模型在信息发生变化时通知观察者(通常是视图),以便他们能够做出反应.
因此,当您呼叫setSelectedIndex时JList,您正在更新其模型,然后通知每个模型ListSelectionListener.如果你可以"默默地"更新模型而不让任何人知道,那就不是MVC.
| 归档时间: |
|
| 查看次数: |
3702 次 |
| 最近记录: |