我有一个关于使用MVC框架用于在Java中编写的二十一点游戏的问题。据我了解,我的模型将是一个存储游戏状态的类,更具体地说,是每个玩家的手。在模型类中,我将拥有一个侦听器数组,每次游戏状态发生变化时都会通知(即玩家已经绘制了一张新卡)。
这些听众将是我的观众,这是处理游戏显示的类。这个类将实现ActionListener接口,每次模型更改时,它都会调用/“通知”我的查看器的actionPerformed方法。
我的问题如下: 我打算有两个JPanel,每个都用于显示各自玩家的手牌。当玩家绘制新卡时,会向面板添加新的ImageIcon。我的问题是,观众班知道如何将牌添加到玩家手中?
我想我可以在通知事件之前存储玩家的手,然后在通知事件中,将新状态与旧状态进行比较,以找出已更改的内容。我在这里是一个完全的新手,所以我可能完全错了,但这样做似乎有点乏味。
是否有更有效/常用的方法来检测模型在前后状态之间发生了哪些变化?另一种解决方案是每次通知发生时重绘整个面板?这会是一个更好的主意吗?
答案 0 :(得分:1)
ActionListener
更专注于按钮行为。在您的用例中,我建议您创建自己的侦听器类,该类携带包含事件和值类型的自定义事件。通常,事件类型可以是“新卡”,“新手”,值可以是玩家ID和卡值。
对于干净的MVC实现,您的面板应该从事件对象获取所需的所有事件信息。它与全局环境的独立性越强,它就越可重复和强大。
答案 1 :(得分:0)
当玩家绘制新卡时,会向面板添加新的ImageIcon。我的问题是观众会怎么知道哪张牌被添加到了玩家手中?
通常情况下,您可以使用BlackJackListener
接口,其方法名为notifyNewCard(player, card)
。 (例如,你不必经历ActionListener
,你可以有更精彩的东西。)
另一种解决方案是每次通知发生时重绘整个面板?这会是一个更好的主意吗?
然而,在这种情况下我会采用的解决方案,只是重新阅读BlackJack模型的整个状态,如上所述。状态将非常简单,因此没有“性能影响”可以谈论,并且您不会冒与模型“不同步”的风险。
在这样的解决方案中,您只需要使用ChangeListener
并说“发生了一些事情,更新您对我的看法”。
答案 2 :(得分:0)
您可以将事件对象传递给模型侦听器,模型侦听器包含有关发生的事件(ADD
,REMOVE
,REPLACE
或复杂CHANGE
)的详细信息以及有关新旧信息的信息值(S)。 JDK中此方法的一个示例是javax.swing.event.ListDataEvent
,javax.swing.event.ListDataListener
和javax.swig.ListModel
。