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