让JScrollPane一直滚动到底部但始终在左边,而不是结尾

时间:2018-05-25 03:37:48

标签: java swing scroll jscrollpane jtextarea

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

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

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

有没有办法可以忽略文本中的水平变化,只是自动垂直滚动(保持当前水平列被查看)。无论是这个,还是总是把它放在左侧。

2 个答案:

答案 0 :(得分:0)

如果您使用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

答案 1 :(得分:0)

您需要手动调整视口位置。因此,您可以使用以下代码创建一个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 );
        }
    }
}

或者不是更改视图位置,而是可以将Caret重置为行的开头,这将导致视口自动重置为左侧:

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