我有一个由JTextPane
支持的JScrollPane
(包含在HTMLEditorKit
中)。 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
获取一个事件,当窗格完成加载时会通知我,以便我可以设置滚动条呢?另一种方法是我设置另一个线程等待一秒左右,然后设置滚动条,但这是一个糟糕的黑客。
您的建议?
答案 0 :(得分:20)
您是否尝试过使用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()方法中使用调试器,而不仅仅是打印堆栈跟踪。
答案 1 :(得分:2)
经过50分钟的绝望后,以下问题解决了我的问题:
JTextPane.grabFocus();
JTextPane.setCaretPosition(20);
答案 2 :(得分:0)
您的应用是否有机会单线程?如果是,您可以请求正在运行的线程列表,并在完成后收到通知,然后设置滚动条值。这是一个选择吗?
或者您可以为每个加载的图像提供ImageObserver,并在报告加载所有图像时设置滚动条的位置?