2010-08-20 90 views
1

我有一个建议弹出JTextField。 DocumentListener侦听所有InsertUpdate-Events并检查Suggestion-List并打开Popup。如果您单击Popup中的Suggestion-Entry,则选定的Word将被设置为JTextField,并且弹出窗口关闭。但是这会触发一个新的InsertUpdate-Event,并且Popup再次打开。防止DocumentEvent循环的最佳方法?

我不想使用布尔标志,或者经常删除并添加监听器。 是否有另一种方法来阻止DocumentEvent循环? 或者有没有一种方法来静默设置文本? 我tryed:

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

回答

1

没有办法插入文本而不触发一个事件也没有这触发了由用户的变化而变化的代码(as in Qt, for example)不同的事件第二API。您必须使用布尔值守护或以其他方式禁用侦听器。

Btw,SWT患有相同的不良设计。

+0

我不明白为什么你不希望使用布尔后卫。 – 2010-08-20 13:39:37

+0

布尔后卫是糟糕的设计;你真正想要的是能够区分用户生成的事件和发生的事件,因为模型在更改后更新UI。如果你不能,那么你需要布尔卫士,你需要比较字段值,看看他们是否真的改变(所以你可以打破事件周期),等等。它也可以防止多线程用户界面(今天的用户界面都运行在一个单一的线)。这是我们习惯的限制,但它仍然是一个设计缺陷。 – 2010-08-20 14:18:00

1

1)删除监听
2)插入弹出的文本
3)添加监听