在JScrollPane上设置滚动条

two*_*e18 6 html java events swing

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

JTextPane text = new JTextPane();
JScrollPane scroll = new JScrollPane(text);
// do some set up...
scroll.getVerticalScrollBar().setValue(0);
Run Code Online (Sandbox Code Playgroud)

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

((AbstractDocument)text.getDocument()).setAsynchronousLoadPriority(-1);
Run Code Online (Sandbox Code Playgroud)

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

你的建议?

Spy*_*der 20

你尝试过使用invokeLater吗?

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

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

scroll.setVerticalScrollbar(new JScrollBar() {
    public void setValue(int value) {
        new Exception().printStackTrace();
        super.setValue(value);
    } 
});
Run Code Online (Sandbox Code Playgroud)

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

  • 不知道.我认为它的设计方式是你必须创建JScrollPane,将它添加到屏幕,然后_then_设置值.对我毫无意义. (3认同)