刷新文本时,在EditorPane中维护以前的位置

时间:2011-07-02 00:04:52

标签: java swing scroll

这是一个困扰我多年的问题。用户正在滚动JEditorPane中包含的文本文档,而JEditorPane又包含在JScrollPane中。用户使用改变文本的按钮执行某些功能(它突出显示文本的某些部分)。然后我在JeditorPane中刷新文档以反映突出显示(使用html标记)。但是当我这样做时,文档会滚动回到顶部。我希望文档在采取操作之前保持在用户所处的相同位置。请注意,用户没有选择文档中的任何文本,因此我无法滚动到选择点(如果选择了文本,该技术确实有效,但在这种情况下我不能这样做)。如何保留JScrollPane中的位置并滚动到用户执行操作之前的位置?

谢谢

4 个答案:

答案 0 :(得分:2)

您可以使用JViewport.scrollRectToVisible()跳转到JScrollPane中文档的某个部分。您可以在使用JViewPort.getViewRect()

执行操作之前对当前位置进行快照

http://download.oracle.com/javase/6/docs/api/javax/swing/JViewport.html

答案 1 :(得分:1)

  

注意,用户未选择文档中的任何文本,因此无法滚动到选择点

在更新前获取选择索引,然后再调用setCaretPosition(previousStart),然后再调用moveCaretPosition(previousEnd)

答案 2 :(得分:1)

您也可以使用:

Point p = scrollPane.getViewport().getViewPosition();
// do stuff
scrollPane.getViewport().setViewPosition();

答案 3 :(得分:0)

我尝试了所有这些潜在的解决方案。不幸的是,无论出于何种原因,他们都没有工作。这是实际为我解决问题的代码。

/ *在更新JeditorPane之前执行此代码:* /

int spoint = detailpane.scrollPane.getVerticalScrollBar().getValue();

/ *然后将滚动恢复到更新前的位置,执行以下代码* /

         SwingUtilities.invokeLater(new Runnable()
    {
    public void run()
    {
    detailpane.scrollPane.getVerticalScrollBar().setValue(spoint);
    }
    });

/ *请注意,由于与Swing相关的常见怪异并非线程安全,因此需要将setValue括在Runnable中。 * /