JScrollPane在JEditorPane中用于长文本滚动

4
我希望在JScrollPane中添加一个JEditorPane。当用户点击按钮时,单击侦听器将创建一个textEditor,调用jscrollpane.setViewPort(textEditor),调用textEditor.setText(String)来填充可编辑的文本,并调用jscrollpane.getVerticalScrollBar().setValue(0)。如果你想知道,是的,setText()必须在setViewPort()之后,原因与此主题无关。
问题在于:用户单击按钮后,JScrollPane的视图会滚动到底部。我希望滚动条位于顶部,就像单击侦听器中的最后一行所示。
我打开了调试器,发现令我震惊的是,在单击侦听器结束后(在泵过滤器时),jscrollpane的视口被强制下移。似乎Swing延迟了编辑器/ jscrollpane的填充,直到单击侦听器结束,但首先调用了滚动条命令。因此,出现了不需要的行为。
总之,我想知道是否有干净的解决方案。似乎想要在修改后将滚动窗格滚动到顶部是一个相当常见的要求,因此我假设这是一个解决良好的问题。
谢谢!
2个回答

4
您可以使用 JEditorPane.setCaretPosition(0)

1

好的,令我惊讶的是,我总是在发布后的几分之一秒内找到答案。

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        pane.getVerticalScrollBar().setValue(0);
    }
});

这样可以延迟滚动操作,直到其他任务完成。问题是:这是好的风格/可靠的,还是只是竞争条件?我能依赖它工作吗?


@Konrad Garus的想法更好,但在EDT上的操作将按程序顺序执行。http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html - trashgod
我会避免使用invokeLater的解决方案,通常有更好的方法。 例如,invokeLater的一个缺点是,在设置invokeLater并实际运行后可能会进行重绘。如果组件的外观发生变化,这可能会在屏幕上产生闪烁。 - Keilly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接