在JScrollPane上设置滚动条

时间:2009-07-22 15:22:12

标签: java html swing events

我有一个由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获取一个事件,当窗格完成加载时会通知我,以便我可以设置滚动条呢?另一种方法是我设置另一个线程等待一秒左右,然后设置滚动条,但这是一个糟糕的黑客。

您的建议?

3 个答案:

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