Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java模块化编程_Java_User Interface_Actionlistener_Modular - Fatal编程技术网

Java模块化编程

Java模块化编程,java,user-interface,actionlistener,modular,Java,User Interface,Actionlistener,Modular,我是Java和这个网站的新手 我正在努力开发一款尽可能模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们是完全独立的。另一个类是两者的接口 问题是我无法让GUI对象(actionPreformed例程所在的位置)触发GameEngine类中的方法。我正在尝试在接口中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不使它们相互依赖) 我的想法是让actionPerformed返回一个代码,该代码在指导下一个操作的接口中处理 例如,NewGame按钮会生成一个新的游戏代码。

我是Java和这个网站的新手

我正在努力开发一款尽可能模块化的游戏。所以我有一个GameEngine类和一个GUI类,它们是完全独立的。另一个类是两者的接口

问题是我无法让GUI对象(actionPreformed例程所在的位置)触发GameEngine类中的方法。我正在尝试在接口中进行所有编程,而不必修改其他两个类中的任何一个(或者至少不使它们相互依赖)

我的想法是让actionPerformed返回一个代码,该代码在指导下一个操作的接口中处理


例如,NewGame按钮会生成一个新的游戏代码。但是,如何在游戏引擎中使用该代码并在界面中触发NewGame方法呢?

使用一些编程模式,比如委派

ActionListener.java:

interface ActionListener {

    public boolean performAction(Action action);

}
GUI.java:

class GUI implements ActionListener {
    protected ActionListener actionListener;

    public void setActionListener(ActionListener listener) {
        this.listener = listener;
    }

    public boolean performAction(Action action) {
      // GUI knows, how to handle specified action:
      if (action.is("toggle-gui")) {
         ...
         return true;
      }

      // else, should Engine try to perform that action?
      if (listener != null)
        if (listener.performAction(action))
          return true;

      // rare occasion
      return false;
    }

}
GameEngine.java:

class GameEngine implements ActionListener {

    public boolean performAction(Action action) {
      if (action.is("game-new")) {
         // start a new game here
         ...
         return true;
      }

      return false;
    }

}
SomeInitializationCode.java

void init() {
  ...

  engine = new GameEngine();
  gui = new GUI();

  gui.setActionListener(engine);

  ...
}
此外,正如您可能已经猜到的,gui对象(如按钮)也有其动作侦听器。当GUI实例化一个按钮时,它将自己设置为按钮的动作监听器,因此,按钮的动作执行被委托给GUI,当GUI不知道如何执行指定的动作时,它将工作委托给自己的委托,从而委托给GameEngine


另外,很抱歉我英语不好。

请发布您的类/接口。一般来说,在使用框架之前,不要尝试编写框架。当然,游戏引擎最好不要依赖于UI,而是从直接从UI调用引擎的代码开始,如果它变得太复杂,那么你可以将其抽象出来。欢迎使用StackOverflow!请务必阅读我们的页面,以帮助您制定一个伟大的问题。如果你对你的问题投入一些精力,你就更有可能从社区中得到一个好的答案。建议:1)将设计模式视为分离关注点的好方法;2)Hunt和Thomas的“实用程序员”中充分阐述了这一概念,作为一种开发复杂程序的更实用的方法。你说你不能访问GUI对象。。。为什么不呢?您可以用GUI做什么?你能附加actionListeners吗?如果是,您可以运行接口(=控制器),一方面将实例引擎,另一方面运行GUI,对所需的actionListeners进行编程。谢谢您的回答。我在项目中使用你的代码