让 JScrollPane 一直滚动到底部但总是在左侧,而不是最后

Have a JScrollPane scroll all the way to the bottom BUT always at the left, not the end

每次使用以下代码将文本附加到 JTextArea 时,我的 JScrollPane 都能够滚动到底部:

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

但是,如果文本太长且不适合框的可视部分,它会滚动到右侧(文本区域的文字末尾)。

有什么方法可以忽略文本的水平变化并自动垂直滚动(保持当前水平列被查看)。要么这个,要么总是放在左边。

如果您有类似于 append(String) 的方法,它允许您轻松地将内容附加到 JTextArea,那么您还可以使用如下内容更新该区域:

public void append(String s) {
    area.append(s.endsWith("\n") ? s : s + "\n"); // your choice here
    area.setCaretPosition(Math.max(area.getText().lastIndexOf("\n"), 0)); // update pos
}

这会将插入符号放在文本的最后 \n

您将需要手动调整视口位置。所以你可以创建一个 append(...) 方法,代码如下:

public void append(JTextArea textArea, String text)
{
    textArea.append( text );

    Component parent = textArea.getParent();

    if (parent instanceof JViewport)
    {
        JViewport viewport = (JViewport)parent;
        Point p = viewport.getViewPosition();

        if (p.x != 0)
        {
            p.x = 0;
            viewport.setViewPosition( p );
        }
    }
}

或者不更改视图位置,您可以将插入符号重置为行的开头,这会导致视口自动重置为左侧:

textArea.append( text );
textArea.setCaretPosition( Utilities.getRowStart(textArea, textArea.getCaretPosition() );