摇摆应用程序有两个主要组件,“上”组件是游戏地图预览,“下”组件是地图的可修改属性,比如它的高度和宽度。
当前,用户输入地图宽度的jtextfield,然后我使用更改侦听器将该值设置为GameMap对象。更改后的GameMap对象会向GameMapListeners触发通知事件,它的主要侦听器是swing应用程序中地图的预览显示。
这允许用户更改地图宽度,并直接在预览窗格中查看结果。
现在我想走另一条路。我希望用户能够在预览窗格中单击并拖动地图的边缘,但随后需要将结果发送到属性面板,以便显示更新的宽度值。
这就是问题所在,如果我更新jtextfield,它将触发一个更改事件,该事件将更新游戏地图并更新预览显示,然后将再次触发一个更改jtextfield的事件(依此类推,直到程序因堆栈溢出而崩溃)
有什么样的设计模式可以替代,或者有什么共同的方法来解决这个问题?
您可以为JTextField使用操作事件。当您以编程方式更改组件时,操作事件不会触发。
如果我更新jtextfield,它将触发一个更改事件,该事件将更新游戏地图并更新预览显示,然后将再次触发一个更改jtextfield的事件(依此类推,直到程序因堆栈溢出而崩溃)。
当您遇到这样的情况时,您可以暂时删除事件侦听器,触发更改事件,并将事件侦听器添加回来。是的,这听起来很痛苦,但这是防止堆栈溢出的好方法。
在我的数独解算器Swing GUI文章中,您可以看到管理事件侦听器的详细说明和工作示例。
在这种情况下,你至少有两个选择...
要触发更改时,请将侦听器删除到另一个组件,在引发事件后将其添加回。。。
更改标志的状态,以指示您应该忽略可能出现的任何更改,在事件发生后重置...
你选择哪一个取决于你想添加多少代码,以及对相关侦听器的引用有多容易获得(也就是说,如果你没有对要删除的侦听器的引用,这有点难以实现)
问题内容: 我有两个分别称为“左”和“右”。“左”按钮将矩形对象向左移动,“右”按钮将其向右移动。我在班上有一个充当单击任一按钮时的侦听器。但是,我希望单击每个动作时都会发生不同的动作。如何区分点击的? 问题答案: 将actionCommand设置到每个按钮。 //将动作命令设置到两个按钮上。 更新:
导入javax.swing.*; class Labels extensions JFrame{ JPanel pnl = new JPanel(); } 如果我想将其用作JApplet怎么办?必须做什么?很难更改吗? JFrame上运行的东西和JApplet上的东西是一样的吗?
问题内容: 我有一个,并且里面有两个。当我按下一个键时,他们两个都必须收听此键事件并采取行动。我要处理所有键盘事件,并将它们传递给两个s。你知道怎么做吗? 编辑:由于他们必须做不同的事情,所以我需要两个不同的侦听器,对不起您不明确。 Edit2:我编写了一个简单的代码来向您展示问题。当我按下向上键时,两个显示的s都必须更改其字符串。在此代码中,只有其中一个实际反应! 问题答案: 代替,使用 按键绑
问题内容: 我们创建了一些我们所有项目都将使用的库,该库将提供我们所有系统的基本功能(登录,某些管理等)。但是应用程序本身可以使用另一个数据库。 我们要做的是用两个持久性单元创建Persistence.xml。并将所有核心库实体打包在一个名为“ LN- model.jar”的jar中,并将所有测试应用程序的实体打包在“ App-model.jar”中。但是由于某种原因,我们仍然会收到以下消息。 无
我有一个监听两个不同端口的TCP服务器。我创建了两个不同的套接字,一个在端口8888上,一个在端口6634上。我监听这些端口,然后我在FD_SET中添加两个套接字,并将它们传递给Select()函数...当套接字准备好读取时,我检查FD_ISSET,看看哪个端口上有消息要读取。 不管怎样,当我连接到8888端口时,构思是成功的,我可以向服务器发送和接收。。。当我在客户端ctrl c时,选择函数再次
服务器部件: 客户部分:io.js 消息组件 信息形式——发布过程的开始