让 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() );
每次使用以下代码将文本附加到 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() );