Java 防止文档事件循环的最佳方法?

Java 防止文档事件循环的最佳方法?,java,swing,Java,Swing,我有一个带有建议弹出窗口的JTextField。DocumentListener侦听所有InsertUpdate事件,检查建议列表并打开弹出窗口。如果单击弹出窗口中的建议条目,则choosen单词将设置为JTextField,弹出窗口关闭。但这将触发一个新的InsertUpdate事件,弹出窗口将再次打开 我不想经常使用布尔标志或删除并添加侦听器。 有没有其他方法可以防止DocumentEvent循环? 或者有没有一种方法可以无声地设置文本? 我试着: this.getTextComponen

我有一个带有建议弹出窗口的JTextField。DocumentListener侦听所有InsertUpdate事件,检查建议列表并打开弹出窗口。如果单击弹出窗口中的建议条目,则choosen单词将设置为JTextField,弹出窗口关闭。但这将触发一个新的InsertUpdate事件,弹出窗口将再次打开

我不想经常使用布尔标志或删除并添加侦听器。 有没有其他方法可以防止DocumentEvent循环? 或者有没有一种方法可以无声地设置文本? 我试着:

 this.getTextComponent().getDocument().insertString()
 this.getTextComponent().setText()

如果不触发事件,就无法插入文本,也没有第二个API为用户的更改和代码的更改触发不同的事件()。您必须使用布尔保护或以其他方式禁用侦听器

顺便说一句,也有同样糟糕的设计。

1)删除侦听器
2) 插入弹出文本

3) 添加侦听器

我不明白你为什么不想使用布尔值保护。布尔值保护设计糟糕;您真正想要的是能够区分用户生成的事件和由于模型在某些更改后更新UI而发生的事件。如果不能,则需要布尔保护,需要比较字段值以查看它们是否真的发生了更改(这样可以中断事件周期),等等。这还可以防止多线程UI(现在的UI都在单个线程中运行)。这是一个限制,我们已经习惯了,但它仍然是一个设计缺陷。