Java 刷新文本时,在编辑器窗格中保持以前的位置

Java 刷新文本时,在编辑器窗格中保持以前的位置,java,swing,scroll,Java,Swing,Scroll,这是一个困扰我多年的问题。用户正在浏览JEditorPane中包含的文本文档,而JEditorPane又包含在JScrollPane中。用户使用更改文本的按钮执行某些功能(突出显示文本的某些部分)。然后我刷新JeditorPane中的文档以反映突出显示(使用html标记)。但当我这样做时,文档会卷回顶部。我希望文档保持在用户在执行操作之前的位置。注意,用户没有在文档中选择任何文本,因此我无法滚动到选择点(如果选择了文本,该技术确实有效,但在这种情况下我无法做到)。如何保留JScrollPane中

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

多谢各位

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

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

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


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

您可以使用JViewport.scrollRectToVisible()跳转到JScrollPane中文档的特定部分。在使用JViewPort.getViewRect()执行操作之前,可以对当前位置进行快照


您可以使用JViewport.scrollRectToVisible()跳转到JScrollPane中文档的某个部分。在使用JViewPort.getViewRect()执行操作之前,可以对当前位置进行快照

您还可以使用:

Point p = scrollPane.getViewport().getViewPosition();
// do stuff
scrollPane.getViewport().setViewPosition();
您还可以使用:

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

我尝试了所有这些可能的解决方案。不幸的是,不管出于什么原因,它们都不起作用。这就是为我解决问题的代码

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

int spoint = detailpane.scrollPane.getVerticalScrollBar().getValue();
/*然后,要将滚动恢复到更新之前的位置,将执行以下代码*/

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

/*注意:由于Swing通常有一些奇怪的特性,它不是线程安全的,因此需要将setValue包含在Runnable中*/

我尝试了所有这些可能的解决方案。不幸的是,不管出于什么原因,它们都不起作用。这就是为我解决问题的代码

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

int spoint = detailpane.scrollPane.getVerticalScrollBar().getValue();
/*然后,要将滚动恢复到更新之前的位置,将执行以下代码*/

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

/*注意:由于Swing通常有一些奇怪的特性,它不是线程安全的,因此需要将setValue包含在Runnable中*/

正如我在最初的帖子中所说的,没有插入符号的位置。未选择文本。@Elliott:您的插入符号位置为0或视口外的某个位置?它始终为零,因为用户没有在编辑器窗格中选择文本。正如我在第一篇文章中所述,没有要获取的插入符号位置。未选择文本。@Elliott:插入符号位置为0或在视口外的某个位置?它始终为零,因为用户未在编辑器窗格中选择文本。