21

我正在尝试使用 JTextArea 实现 JScrollPane。JTextArea 被附加到,我希望 JScrollPane 在添加更多文本时继续向下滚动。如何做到这一点?

4

7 回答 7

41

对于(我认为是)更简单的答案,请查看:文本区域滚动

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

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

这样做的好处是您无需在代码中多次使用此代码段!

于 2010-03-20T16:32:48.903 回答
7

我在这里找到了答案: JScrollPane and JList auto scroll

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
        public void adjustmentValueChanged(AdjustmentEvent e) {  
            e.getAdjustable().setValue(e.getAdjustable().getMaximum());  
        }
    });
于 2010-03-20T15:38:48.573 回答
6

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

textArea.setCaretPosition(textArea.getDocument().getLength());

就在您添加新数据之后。

这将自动向下滚动到 JScorllPane。

于 2012-07-14T00:45:24.677 回答
5

这是解决方案。

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);` 
于 2014-01-04T12:07:52.323 回答
2

公认的解决方案效果很好,但仅当文本区域可编辑时,即没有jTextArea.setEditable(false). Krigath建议的解决方案更通用,但存在JScrollPane 和 JList auto scroll问题。使用该问题的答案,您可以获得一般解决方案,例如:

        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();
            });

然后,仅当垂直滚动条展开时,窗格才会向下滚动,以响应附加的文本行。

我承认可以找到一种在没有额外变量的情况下过滤事件的方法,如果有人发布它,我将不胜感激。

于 2018-09-27T15:06:26.310 回答
1

一种解决方法是可能的:您可以将该侦听器声明为一个类,然后在需要它的事件上实例化它。之后,您可以在强制重新绘制屏幕后删除该类。奇迹般有效。

于 2011-09-09T01:44:05.810 回答
0

我查看了答案,发现@user9999答案对于那些希望滚动条连续滚动的人来说是一个很好的解决方案。我编辑了代码,摆脱了变量。它使滚动停止 - 当用户手动滚动时。如果用户滚动到 textarea 或 scrollarea 的末尾,则自动滚动继续。

(也正如@user9999 建议的那样,我删除了变量并添加了jScrollPane1.getHeight()作为度量值以在当前滚动条值低于最大值时停止滚动)

这是解决方法:

jScrollPane1.getVerticalScrollBar().addAdjustmentListener(
e -> {
    if ((e.getAdjustable().getValue() - e.getAdjustable().getMaximum()) > -jScrollPane1.getHeight() - 20){
        e.getAdjustable().setValue(e.getAdjustable().getMaximum());
    }   
});

编辑:

添加-20-jScrollPane1.getHeight() - 20它有时不会滚动没有它,我猜-20可以更改取决于TextArea的字体大小。

于 2021-12-25T09:33:07.087 回答