3

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

4

3 回答 3

5

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

于 2012-04-12T13:52:08.850 回答
1
  • Document 是 JTextComponents 的模型,然后把两个或多个 Listeners 写到 Document 的更改不是一个好主意,

  • 如果模型向视图调用所有已实现的事件,则所有事件都应该完成,那么只有当所有事件都在视图中完成时,才可以使用 JViewport 移动

  • 不知道你实现了什么侦听器,但是 DocumentListener(例如)和 FocusListener(ei)可以创建无限循环,但 RepaintManager 有很好的例外

  • 删除产生异常的监听器,如果确实需要添加监听器,立即删除使用的监听器,

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

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

于 2012-04-12T14:51:19.637 回答
0

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

于 2012-04-20T12:35:55.463 回答