Java 自动滚动到滚动窗格的底部
我看了一下,找到了答案=>Java 自动滚动到滚动窗格的底部,java,scroll,Java,Scroll,我看了一下,找到了答案=> JScrollBar vertical = scrollPane.getVerticalScrollBar(); vertical.setValue( vertical.getMaximum() ); 工作得很好 然而,当有大量的输出时,它不会直接进入底部 我现在添加了一个延迟(不是来自EWT),然后在EWT中添加了另一个更新,这就完成了 Thread thread = Thread.currentThread(); try {
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
工作得很好
然而,当有大量的输出时,它不会直接进入底部
我现在添加了一个延迟(不是来自EWT),然后在EWT中添加了另一个更新,这就完成了
Thread thread = Thread.currentThread();
try {
thread.sleep(99);
} catch (InterruptedException ex) {
}
SwingUtilities.invokeLater(new Runnable() {
public void run() { log(""); }
});
是否有一种简单的方法来等待所有输出调用完成
不知道您正在做什么,但通常不想使用Thread.sleep(…)
相反,您可以将代码包装在SwingUtilities.invokeLater(…)
中。这将把代码放在事件分派线程(EDT)的末尾,以便在其他处理完成后执行
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( vertical.getMaximum() );
}
});
阅读上Swing教程中的部分,了解有关EDT的更多信息以及这一点的重要性
对于您的代码,可能更好的解决方案是使用教程中所述的
SwingWorker
。如果我在SwingWorker线程中,EDT是否仍会执行此操作?使用SwingWorker的要点是,它让您和API在单独的线程中执行一些代码,但随后在EDT线程上执行其他代码。当您“发布”在EDT上自动执行的结果时。当您实现也在EDT中执行的done()方法时。再次阅读本教程,了解有关SwingWorker的更多信息,包括工作示例。