0

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

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

这使用户可以更改地图宽度并立即在预览窗格中查看结果。

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

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

有没有我可以使用的设计模式,或者有一些常见的方法来解决这个问题?

4

3 回答 3

1

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

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

您可以在我的Sudoku Solver Swing GUI文章中查看详细说明以及管理事件侦听器的工作示例。

于 2013-11-01T08:36:19.183 回答
1

In this type of case, you have at least two choices...

You Could

Remove the listener to the other component when you want to trigger a change, adding it back after you've raised the event...

You Could

Change the state of a flag to indicate that you should ignore any changes that might come in, resetting after you're raised the event...

Which one you choose will depend on how much code you want to add and how readily available the reference to the listeners in question are (ie, if you don't have a reference to the listener you want to remove, it's kind of hard to implement)

于 2013-11-01T02:13:53.997 回答
0

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

于 2013-11-01T02:49:53.820 回答