【问题标题】:How can I force an event listener to execute last in java?java - 如何强制事件侦听器在java中最后执行?
【发布时间】:2012-04-12 13:49:11
【问题描述】:

我有一个 JTextPane,它有一个 DocumentListener 等待对基础 HTML 文档的更改。当内容发生变化时,事件使用 JTextPane.scrollToReference 将视图移动到某个参考锚点。问题是 JTextPane 中的底层视图也在监听文档更改,并且直到我的监听器执行后才会更新,这会导致异常。有什么方法可以强制我的 DocumentListener 在该特定事件的任何其他事件侦听器之后执行?或者有什么方法可以在执行我的代码之前等待视图更新?

【问题讨论】:

标签: java swing events


【解决方案1】:

首先尝试将 SwingUtilities.invokeLater() 用于必须作为最后执行的侦听器。如果这不起作用,请构建您自己的优先级队列。

【讨论】:

  • 我试过invokeLater,现在没有异常了,但是每次都滚动到屏幕底部。有趣的事情:我在 invokeLater 内的 scrollToReference 行设置了一个断点,滚动条甚至还没有显示在 JTextPane 上。
【解决方案2】:
  • Document 是 JTextComponents 的模型,那么最好放两个或多个 Listeners 对 Document 进行更改,

  • 如果模型向视图调用所有已实现的事件,则应完成所有事件,然后只有在视图中完成所有事件时,才能使用 JViewport 移动

  • 不知道你实现了什么监听器,但是 DocumentListener(例如)和 FocusListener(e.i.)可以创建无限循环,但 RepaintManager 的异常很好

  • 移除产生异常的Listener,如果真的需要添加Listener,立即移除uselles Listener,

  • Swing 完全没有保证 Listener 的顺序,也没有来自 model_to_view 之间的多重 Listeners 的事件,反之亦然

  • 您可以通过从 Swing Action(从 Swing 计时器延迟)推送所需事件或通过 Thread.sleep(int) 推送异步侦听器(冻结)来测试侦听器是否随后或逐渐触发事件

    李>

【讨论】:

    【解决方案3】:

    我最终不得不扩展 Viewport 和 JScrollPane 类来实现这一点。我为视口的更改事件公开了一个侦听器,并在其中添加了我的逻辑(确保它是渲染链中执行的最后一个代码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2014-04-01
      • 2021-06-11
      • 2011-11-29
      • 2020-12-03
      • 2016-07-24
      相关资源
      最近更新 更多