在JScrollPane上设置滚动条

我有一个由HTMLEditorKit支持的JTextPane (包装在JScrollPane )。 JTextPane的内容是简单的HTML,其中一些图像(本地文件)使用img标签嵌入。 问题是当你加载JTextPane ,它需要一瞬间加载,然后它会在页面底部出现滚动条。 如果我做:

 JTextPane text = new JTextPane(); JScrollPane scroll = new JScrollPane(text); // do some set up... scroll.getVerticalScrollBar().setValue(0); 

它会暂时设置滚动条,然后另一个thead(可能是负责加载图像)来并将滚动条敲回底部。 我尝试添加:

 ((AbstractDocument)text.getDocument()).setAsynchronousLoadPriority(-1); 

但这并没有解决它。 有没有办法从text.getDocument()text中获取一个事件,当窗格完成加载时会通知我,以便我可以设置滚动条呢? 另一种方法是我设置另一个线程等待一秒左右,然后设置滚动条,但这是一个糟糕的黑客。

你的建议?

你尝试过使用invokeLater吗?

 final JScrollPane scroll = new JScrollPane(text); javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { scroll.getVerticalScrollBar().setValue(0); } }); 

如果这不起作用,挖掘图像视图是非常困难的,所以我的下一步是追踪滚动条改变的原因:

 scroll.setVerticalScrollbar(new JScrollBar() { public void setValue(int value) { new Exception().printStackTrace(); super.setValue(value); } }); 

您还可以在setValue()方法中使用调试器,而不是仅打印堆栈跟踪。

经过50分钟的绝望后,以下问题解决了我:

 JTextPane.grabFocus(); JTextPane.setCaretPosition(20); 

你的应用程序是否有机会单线程? 如果是,您可以请求正在运行的线程列表,并在完成后收到通知,然后设置滚动条值。 这是一个选择吗?

或者,您可以为每个加载的图像提供ImageObserver,并在报告加载所有图像时设置滚动条的位置?