2009-07-22 70 views
6

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

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得到一个事件,当窗格加载完成后会通知我,这样我就可以设置滚动条了?另一种方法是我建立另一个线程等待一秒钟左右,然后设置滚动条,但这是一个不好的破解。

您的建议?

回答

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()方法中,而不是仅仅打印堆栈跟踪。

0

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

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

+1

Swing应用程序依赖于一个线程调用事件分派线程来控制所有GUI操作。如果需要,您可以解决此问题,但我现在正在执行的所有工作都在“事件调度线程”上。这可以被认为是一种选择,但可能和我在我的问题中提出的一样糟糕。但我会记住它。 – twolfe18 2009-07-22 16:03:39

+0

ImageObserver可能会工作... – 2009-07-22 16:06:39

1

下解决了这个问题对我来说,51分钟的绝望后:

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