【问题标题】:How to go about with real GUI development with Java Swing and MVC如何使用 Java Swing 和 MVC 进行真正的 GUI 开发
【发布时间】:2011-01-20 05:02:28
【问题描述】:

我正在创建一个二十一点纸牌游戏模拟器。我是一名 SCJP,熟悉核心 Java 概念。我对 Java swings 和 awt 有非常基本的了解。 已经写完了基本的游戏逻辑,一个CLI逻辑。我的设计包括几个类,例如, 经销商,玩家,表,卡,赌场和其他一些.. 卡片和套件的枚举。

我读过关于 MVC 作为一个理论概念,熟悉“设计模式”这个名称(不了解它们是如何实现的)到处建议我在编写一些真正的代码时学习。所以我从这个开始...

我现在卡住了,我应该如何为我的项目编写代码?编写 GUI 代码并在现有代码中组织它。

【问题讨论】:

  • 我不了解如何在 Java 中实现 MVC。 :(
  • MVC 不需要以您正在编程的语言实现。唯一的要求是松散的概念分离,即模型、视图和控制器。你不应该扩展模型或视图或控制器,或类似的东西。至少,将模型和视图放在单独的包中。

标签: java model-view-controller swing


【解决方案1】:

我花了很长时间才学会 MVC(我在大学里学到了一些关于它的错误知识,而且当时很多在线资源都是错误的)。无论如何,你需要做的核心是在你的模型中没有任何视图信息(即玩家在屏幕上的样子、帧缓冲区、模型的多边形)。相反,您在单独的命名空间中创建视图和模型,然后使用事件将两者链接在一起。当您的模型中有时发生时,视图会收到通知,并对视图进行更改。此外,当按下鼠标或按下某个键时,输入事件将转换为另一个面向模型的事件,该事件可以采用对模型进行方法调用的形式。然后将模型中的任何更改反馈到视图中。

记住这一点:模型应该在没有附加视图的情况下正常运行,并且在执行时不应该在屏幕上显示任何内容(可能除了控制台中的调试信息)。

【讨论】:

  • 我应该把我的 Gui 代码放在哪个班级?有这么多类..在哪里处理事件?如何决定?
  • 以二十一点为例:BlackJack(模型)和 BlackJackApp(视图)。您使用通知/侦听器模式将 BlackJackApp 附加到模型(可能调用 JFrame 或其他东西),并在模型更改时通知视图(最初为整个游戏状态创建一个大侦听器)。然后视图中的任何标准操作都只是调用模型中的方法。即 Card[] getCards(Player p), showHand(Player p),带有类似 onShowHand(Player p) 的事件通过侦听器通知视图。您可能需要模型中的 next() 方法来推进游戏
【解决方案2】:

这是一个如何拆分的简单示例。

据推测,玩家的牌表示为“手”或类似的对象(即牌的集合)。这是你的模型。所以让我们调用你的模型:

package casino.blackjack.model;
class DealtCards
{..}

您可能使用 JPanel 或其他一些 Swing 构造来显示您的卡片。因此,您可以将实际渲染每张卡片的所有对象放在一个单独的包中:

package casino.blackjack.view;
class DealtCardsView
{..}

DealtCards 对象的存在独立于它的显示方式,但如果用户在 GUI 上执行某些操作,它的状态可能会改变。例如,要求被“击中”。据推测,可能有一个按钮来执行此操作。视图源自您的模型。

package casino.blackjack.view;
class DealtCardsView
{
  JButton hitMeButton = new JButton("HIT");
  DealtCards cards;

  public DealtCardsView(DealCards myCards)
  {
     cards = myCards;
     renderCards();
  }

  private void renderCards(){.. do something..}

}

现在,如果玩家决定击球,他的 DealtCards 对象就会改变。因此,我们希望实现一种更新模型的方式。您可以使用控制器类来执行此操作。控制器类实现 ActionListener 接口。当执行一个动作时(即用户点击“点击”按钮),控制器更新模型。所以视图不能直接更新模型。它只是发送一个“动作”已经发生的通知。任何相关方,在这种情况下,即我们的控制者,都可以采取适当的行动。

package casino.blackjack.controller;
class DealtCardsController implements ActionListener
{
  DealtCards cards;
  DealtCardsView cardView;
  public DealtCardsController(DealtCards myHand, DealtCardsView myView)
  {
    cards = myHand;
    cardView = myView;
    cardView.hitMeButton.addActionListener(this);
  }

  public void actionPerformed(ActionEvent e) 
  {
    cards.changed();
  }
}

因此,您将应用程序分为三层。您的模型只包含当前状态(或当前数据)以及围绕它的任何验证。您的视图类以适当的方式呈现模型。视图上的任何用户交互都由控制器处理,然后控制器负责更新模型。
这样,如果您想更改视图(例如使用小程序而不是窗口),您的模型就不会在意。
抱歉,回复冗长,但希望对您有所帮助!

编辑:这里有一个很好的 MVC 解释:java / gwt UI coding - clean code

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 2018-03-22
    • 2017-03-13
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多