【问题标题】:best way to prevent a DocumentEvent cycle?防止 DocumentEvent 循环的最佳方法?
【发布时间】:2011-04-01 16:04:19
【问题描述】:

我有一个带有 Suggestion-Popup 的 JTextField。 DocumentListener 监听所有 InsertUpdate-Events 并检查 Suggestion-List 并打开弹出窗口。如果您单击弹出窗口中的 Suggestion-Entry,则选择的 Word 将设置为 JTextField 并且弹出窗口关闭。但这会触发一个新的 InsertUpdate-Event 并且弹出窗口会再次打开。

我不想经常使用布尔标志或删除和添加侦听器。 还有其他方法可以防止 DocumentEvent 循环吗? 或者有没有办法静默设置文本? 我试过了:

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    1) 移除监听器
    2) 插入弹出文本
    3) 添加监听器

    【讨论】:

      【解决方案2】:

      没有办法在不触发事件的情况下插入文本,也没有第二个 API 可以针对用户的更改和代码的更改触发不同的事件 (as in Qt, for example)。您必须使用布尔值守卫或以其他方式禁用侦听器。

      顺便说一句,SWT 也遭受了同样糟糕的设计。

      【讨论】:

      • 我不明白你为什么不想使用布尔守卫。
      • 布尔守卫是糟糕的设计;您真正想要的是能够区分用户生成的事件和发生的事件,因为模型在某些更改后会更新 UI。如果你不能,那么你需要布尔值守卫,你需要比较字段值以查看它们是否真的改变了(这样你就可以打破事件循环)等等。它还可以防止多线程 UI(今天的 UI 都运行在一个单一的线)。这是我们已经习惯的限制,但它仍然是一个设计缺陷。
      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2020-12-06
      • 2010-10-23
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多