在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,并在报告加载所有图像时设置滚动条的位置?