Java 设计一个具有2个侦听器和2“的组件;“二传手”;(Swing应用程序)

Java 设计一个具有2个侦听器和2“的组件;“二传手”;(Swing应用程序),java,swing,design-patterns,listener,Java,Swing,Design Patterns,Listener,我正在使用JavaSwing为我基于tile的java游戏制作一个地图编辑器。swing应用程序有两个主要组件,“上”组件是游戏地图预览,“下”组件是地图的可修改属性,如其高度和宽度 当前,用户输入地图宽度的jtextfield,然后我使用更改侦听器将该值设置为GameMap对象。更改后的GameMap对象会向GameMapListeners触发通知事件,它拥有的主要侦听器是swing应用程序中地图的预览显示 这允许用户更改地图宽度,并在预览窗格中查看结果 现在我想走另一条路。我希望用户能够在预

我正在使用JavaSwing为我基于tile的java游戏制作一个地图编辑器。swing应用程序有两个主要组件,“上”组件是游戏地图预览,“下”组件是地图的可修改属性,如其高度和宽度

当前,用户输入地图宽度的jtextfield,然后我使用更改侦听器将该值设置为GameMap对象。更改后的GameMap对象会向GameMapListeners触发通知事件,它拥有的主要侦听器是swing应用程序中地图的预览显示

这允许用户更改地图宽度,并在预览窗格中查看结果

现在我想走另一条路。我希望用户能够在预览窗格中单击并拖动地图的边缘,但随后需要将结果发送到属性面板,以便显示更新的宽度值

这就是问题所在,如果我更新jtextfield,它将触发一个更改事件,该事件将更新游戏地图并更新预览显示,然后将再次触发一个更改jtextfield的事件(依此类推,直到程序因堆栈溢出而崩溃)


是否有任何类型的设计模式可以替代,或者是否有一些常见的方法来解决此问题?

在这种情况下,您至少有两种选择

你可以 如果要触发更改,请将侦听器删除到其他组件,并在引发事件后将其添加回

你可以 更改标志的状态,以指示您应忽略可能发生的任何更改,并在引发事件后重置


选择哪一个取决于要添加多少代码以及对所讨论的侦听器的引用的可用性(即,如果没有对要删除的侦听器的引用,则很难实现)

您可以对JTextField使用操作事件。以编程方式更改组件时不会触发操作事件

如果我更新jtextfield,它将触发一个更改事件,该事件将更新游戏地图并更新预览显示,然后将再次触发一个更改jtextfield的事件(依此类推,直到程序因堆栈溢出而崩溃)

遇到这种情况时,可以临时删除事件侦听器,触发更改事件,然后重新添加事件侦听器。是的,这听起来很痛苦,但这是防止堆栈溢出的好方法


在我的文章中,您可以看到管理事件侦听器的详细说明和工作示例。

我正在使用值更改侦听器来侦听对jtextfield的更新(jtextfield保存数字,而mouseheel允许您上下滚动数字,值侦听器是我可以找到的唯一可靠的方法“听到”对文本字段的所有更改并将其传递到GameMap您可以使用文档侦听器来听到对文本的所有更改,尽管这也可能触发事件。否则,我建议程序员这么说。当我绝对必须使用更改侦听器时,我会使用标志。