如何强制事件监听器在java中执行最后一次?

时间:2012-04-12 13:49:11

标签: java swing events

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

  • Document是来自JTextComponents的模型,然后不好的想法就是把两个或更多的Listener写入了对Document的更改,

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

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

  • 删除生成异常的Listener,如果确实需要添加Listener,立即删除uselles Listener,

  • 完全没有听众的倾听,也没有来自多重播放的侦听器的事件,模型为to_view,反之亦然

  • 您可以通过Thread.sleep(int)推送来自Swing Action(从Swing Timer延迟)或异步Listener(冻结)的必需事件来测试Listeners随后或逐渐触发事件

答案 2 :(得分:0)

我不得不扩展Viewport和JScrollPane类来实现这一目标。我为viewport的change事件公开了一个监听器,并在那里添加了我的逻辑(这确保它是渲染链中执行的最后一个代码)。

相关问题