Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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_Swing_Events_Event Handling_Actionevent - Fatal编程技术网

Java 在同一事件上以不同的方式使用不同的侦听器

Java 在同一事件上以不同的方式使用不同的侦听器,java,swing,events,event-handling,actionevent,Java,Swing,Events,Event Handling,Actionevent,我有一点难以理解swing和事件驱动界面。我在做一个学校的项目,我们必须建造一个类似棋盘的东西,在那里我们可以放置棋子,移动棋子,并在输入上互相攻击。这就是我迷路的地方: 我的棋盘(有点)摆好了。我在一个JPanel上布置了许多图块(这是一个保存坐标和图块的模型,还有一个视图,目前它是JComponent的一个基本子类)。 然后我有了可以移动、攻击等的棋子 现在,当我点击瓷砖时,我必须做不同的事情。例如: 如果瓷砖是空的,我想在上面放一个当铺 如果互动程序被占用,我希望弹出一个对话框,上面有不

我有一点难以理解swing和事件驱动界面。我在做一个学校的项目,我们必须建造一个类似棋盘的东西,在那里我们可以放置棋子,移动棋子,并在输入上互相攻击。这就是我迷路的地方:

我的棋盘(有点)摆好了。我在一个JPanel上布置了许多图块(这是一个保存坐标和图块的模型,还有一个视图,目前它是JComponent的一个基本子类)。 然后我有了可以移动、攻击等的棋子

现在,当我点击瓷砖时,我必须做不同的事情。例如:

  • 如果瓷砖是空的,我想在上面放一个当铺
  • 如果互动程序被占用,我希望弹出一个对话框,上面有不同的按钮(移动、攻击…)
  • 如果我单击“移动”,我必须单击另一个磁贴并检查它是否已被占用,然后更改第一个磁贴和棋子的状态
  • 如果我点击攻击,我想点击另一个瓷砖并改变,如果它被占用,改变瓷砖上的兵的状态
现在,前两个有点简单,我可以让棋子听瓷砖,当瓷砖被点击时,我可以显示对话(如果瓷砖上有棋子),或者如果瓷砖是自由的,将棋子放在上面

当我必须单击对话框上的按钮,然后单击另一个互动程序,让多个东西进行通信时,问题就出现了

我能做什么? 假设我们在谈论攻击按钮

  • 我点击瓷砖,当兵听到点击并显示对话框
  • 我单击攻击按钮,攻击按钮的侦听器接收输入 现在怎么办

    我想我应该让“攻击按钮侦听器”也来听瓷砖。但它只应在特定情况下以这种方式作出反应。当我单击一个互动程序并且我不想攻击时,如何让侦听器什么也不做? 我不认为我可以只看事件对象(因为我不能直接修改它来做我需要的事情?)。因此,也许最好的办法是给听者一个“游戏系统”对象的引用,它基本上控制游戏(回合、可用棋子、时间等),并且有一个变量,用于区分游戏所处的状态(移动、攻击、放置棋子…)

    一个无关紧要的问题,给听众和按钮之类的东西参考他们周围的环境(比如他们所在的框架,或者在本例中是游戏系统)是好还是坏的做法。从我的初学者的角度来看,如果一个按钮或一个听者没有引用他们需要询问/访问什么才能工作,他们基本上什么都做不了,但也许我错了,我用了错误的方式


    我希望我清楚地暴露了我的问题。谢谢大家的帮助。

    看来你已经不再把事情复杂化了。为什么要对话?为什么不用一块突出显示单击的正方形,然后让用户再次单击并移动单击。然后,模型(游戏的非gui表示)检查移动是否有效,是否是攻击,以及是否是攻击。所有的主要逻辑都应该进入你的模型,GUI本身应该尽可能的哑。我考虑过这个对话框,因为我希望当用户用棋子点击一个平铺时会出现一个弹出窗口,这样它就可以选择做什么。你说“移动点击”,你的确切意思是什么?如果我删除了对话,我当然会删除一层复杂的内容,但我是否仍然存在单击第一个互动程序,然后单击第二个互动程序,并以不同的方式对第二次单击作出反应的问题?是的,主要的逻辑已经存在于我的模型/控制器中,基本上我不太理解的是如何“收集数据”来提供逻辑。点击就是点击,对于GUI来说,“视图”只意味着“用户点击了这个方块”。然后将此信息报告给模型,其后续行为将取决于其当前状态。因此,模型应该知道这是第一次还是第二次单击,然后采取相应的行动。但是您的GUI侦听器可能非常简单,主要作用是向模型报告事件,就这样。哦,我明白您的意思了。这肯定会有帮助。