Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动滚动到滚动窗格的底部_Java_Scroll - Fatal编程技术网

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的更多信息,包括工作示例。