【问题标题】:Class design: change text on button click类设计:单击按钮更改文本
【发布时间】:2009-03-16 10:42:41
【问题描述】:

我正在制作的游戏有 2 个类:一个 gui 类和一个逻辑类,用于一个三字棋游戏。 GUI 类有一个使用JButtons 数组的方法,并使用相同的匿名内部类操作侦听器将它们全部返回。

当我单击按钮时,我希望文本更改为取决于玩家 1 或 2 的 x 或 o,但是这段代码应该在逻辑类中,不是吗,所以我应该以某种方式在逻辑类并从 make 按钮方法的匿名内部类动作侦听器调用它。但是,逻辑类不应该有对 gui 的引用,因为 gui 有对逻辑类的引用。

【问题讨论】:

    标签: java coupling cohesion


    【解决方案1】:

    考虑下面的类草图:

    public class Game{
        public void switchPlayer(){
            // among other things calls all GameListeners
        }
        public void setMarker(int x, int y);
    
        public Player getCurrentPlayer();
        public Player getPlayerOwningField(int x, int y);
    
        public void registerGameListener(GameListener l);
    }
    
    public interface GameListener(){
        void gameChanged(Game g)
    }
    
    public class GUI implements GameListener(){
        private Game game;
    }
    

    当一个字段被点击时,game.setMarker(x,y) 被调用。游戏知道当前玩家是谁,因此它可以适当地标记该字段。它还将触发 GameChanged 事件。在应用程序设置期间,gui 必须注册/注册为游戏的 GameListener。所以它也会得到通知。它使用游戏的 getter 来更新 gui。完成。

    当然还有很大的改进空间,例如在大型游戏中,仅仅因为一个字段发生变化而更新完整的 UI 并不是一个好主意,但它应该能让你开始

    【讨论】:

      【解决方案2】:

      也许使用一个事件。因此,您可以在逻辑计算的 GUI 端做出反应,并按照命令进行操作;)

      【讨论】:

      • 抱歉,事件是什么意思,有没有更好的方法来解释这一点,或者可能将我链接到有关您的意思的教程?
      • 关于事件的 Sun 文档:java.sun.com/docs/books/tutorial/uiswing/events/index.html 我不是 Java 程序员,所以我没有代码可以作为示例发布。
      【解决方案3】:

      使用同一个实例作为多个按钮的动作监听器几乎肯定是个坏主意。使用按钮位置参数化的同一实现类的单独实例。然后,侦听器可以使用适合模型的接口调用模型。

      【讨论】:

        【解决方案4】:

        如果您专注于设计(这听起来像是家庭作业),您可以试试MVC (Model-View-Controller)

        在这种情况下,

        model = game logic, rules (fire events when things change)
          gui = (in this case and many swing apps) is both view and controller. Manipulates the model (control) and the model fires events back to update the widgets (view)
        

        【讨论】:

          【解决方案5】:

          我不认为双向引用(GUI 具有模型的引用,反之亦然)应该是一个问题。我认为您正在寻找的是 MVC(模型-视图-控制器)方法。我不知道您使用哪种编程语言来编写该游戏以及是否应用这种方法在这种情况下可能是一种开销。 我用 Java 编写了一个 MVC 方法的小演示:http://blog.js-development.com/2008/03/logical-separation-with-mvc.html

          也许对你有帮助,请告诉我。

          【讨论】:

            【解决方案6】:

            当按钮点击发生时,你的 GUI 调用逻辑通知它当前玩家(逻辑知道当前玩家)点击了某处的网格。然后逻辑更新状态(更新网格,更新当前播放器,...)并将事件发送回 GUI,通知 GUI 它必须更新自身。

            GUI“知道”调用操作的逻辑。为了避免逻辑不知道 GUI 并有良好的关注点分离,逻辑应该通过观​​察者模式耦合到 GUI,而不是直接调用 GUI 的逻辑。 GUI 监听来自逻辑的事件。然后逻辑只是动态耦合到 GUI,这不是问题。

            【讨论】:

              【解决方案7】:

              您可以应用MVC 模式。

              UI 类 (Controller) 将消息发送到 Logic 类 (Model),后者将更新 View (Class)。你需要定义这个。它可以像一个布尔值数组一样简单。

              UI 代码必须读取 View 类才能更改按钮中的文本。因此,当 View 发生变化时,您需要向 UI 类发送“无效”消息,以便更新按钮文本。

              这里的关键点是 UI 代码参考 View 对象来呈现按钮。完全正确的是 UI 类读取这个对象并编写它的逻辑类。

              【讨论】:

                【解决方案8】:

                在数据库中保存事件标志或某事。像那样在你的 gui 中查询这个标志 像异步一样工作。事件

                【讨论】:

                • 下次再​​努力,D+。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多