2010-08-20 88 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)添加監聽