Java 使JScrollPane自动向下滚动

Java 使JScrollPane自动向下滚动,java,swing,awt,jscrollpane,jtextarea,Java,Swing,Awt,Jscrollpane,Jtextarea,我正在尝试用JTextArea实现一个JScrollPane。JTextArea被追加到,我希望随着更多文本的添加,JScrollPane保持向下滚动。如何做到这一点?我在这里找到了答案: 对于(我认为是)一个更简单的答案,请查看: 在JDK5之前,您必须在每次追加后手动更改插入符号的位置。您现在可以将此行为作为默认设置,如下所示: JTextArea textArea = new JTextArea(); DefaultCaret caret = (DefaultCaret)textAr

我正在尝试用JTextArea实现一个JScrollPane。JTextArea被追加到,我希望随着更多文本的添加,JScrollPane保持向下滚动。如何做到这一点?

我在这里找到了答案:

对于(我认为是)一个更简单的答案,请查看:

在JDK5之前,您必须在每次追加后手动更改插入符号的位置。您现在可以将此行为作为默认设置,如下所示:

 JTextArea textArea = new JTextArea();
 DefaultCaret caret = (DefaultCaret)textArea.getCaret();
 caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
这样做的好处是,您不需要在代码中多次使用此代码段


解决方法是可能的:您可以将该侦听器声明为类,然后在需要它的事件上实例化它。之后,您可以在强制重新绘制屏幕后删除该类。工作起来很有魅力。

如果您不断向其写入数据,您可以使用:

textArea.setCaretPosition(textArea.getDocument().getLength());
在添加新数据之后

这将自动在JScorllPane中向下滚动。

以下是解决方案

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 

接受的解决方案效果良好,但仅当文本区域可编辑时,即不带
jTextArea.setEditable(false)
。所建议的解决方案更一般,但存在此处所问的问题。使用该问题的答案,您可以得到一般解决方案,例如:

        JScrollPane scrollPane = new JScrollPane(jTextArea);

    verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
    scrollPane.getVerticalScrollBar().addAdjustmentListener(
            e -> {
                if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
                    return;
                e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
            });
只有当垂直滚动条根据附加的文本行展开时,窗格才会向下滚动。
我承认可以找到一种无需额外变量就可以过滤事件的方法,如果有人发布它,我将不胜感激。

+1
setUpdatePolicy()
API解释了这么多。我已经相应地更新了我对所引用问题的回答。是的,API一直在变化,很难一直跟上变化。这很有帮助,但如果用户在最后一行结束后以外的任何地方单击,自动滚动就会停止。这是不直观的。如果正常的行为起作用就好了,只需滚动到底部,自动滚动就会被重新激活。@jcalfee314,请查看其他可能的解决方案。@jcalfee314为了解决这个问题,我添加了一个按钮,单击该按钮后,再次启用自动滚动。按钮的代码只需要以下内容:textArea.setCaretPosition(textArea.getDocument().getLength());您的“解决方案”实际上是链接到问题的问题:如果您手动尝试移动垂直滚动手柄,此代码将再次滚动到底部!虽然可能,但这并不是最好的解决方案,@camickr的答案是-)+1表示正确答案,尽管它与Rob的公认答案相同:-)
        JScrollPane scrollPane = new JScrollPane(jTextArea);

    verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
    scrollPane.getVerticalScrollBar().addAdjustmentListener(
            e -> {
                if ((verticalScrollBarMaximumValue - e.getAdjustable().getMaximum()) == 0)
                    return;
                e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                verticalScrollBarMaximumValue = scrollPane.getVerticalScrollBar().getMaximum();
            });