67

我在 JScrollPane 上嵌入了一个 JTextArea,并使用该 JTextArea 进行输出。

我希望每当输出超出 JTextArea 的大小时,JTextArea 就会自动滚动,这样用户就不必手动向下滚动来查看最近的输出。

我怎样才能做到这一点?

我已经将 JTextArea 和 JScrollPane 的 autoscroll 属性设置为 true。

4

8 回答 8

150

使用 JDK1.4.2(或更早版本)时,您会在论坛中找到的最常见建议是使用如下代码:

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

但是,我刚刚注意到,在 JDK5 中,这个问题实际上已通过 API 更改解决。您现在可以通过在文本区域的 DefaultCaret 上设置属性来控制此行为。使用这种方法,代码将是:

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

笔记:

上述设置插入符号更新策略的建议不起作用。

相反,您可能想要查看智能滚动,它使用户能够确定何时滚动应该是自动的。

可以在此处找到有关文本区域中自动滚动的更详细说明:文本区域滚动

于 2009-10-26T20:10:39.283 回答
2

当您单击 JTextArea 上的任意位置时,可能会停止自动滚动。因为插入符号的位置一旦改变,视点也改变了。此时,您应该在追加或添加一些文本时设置插入符号位置。在途中,我制作了包括设置插入符号位置的方法,然后在添加或附加任何内容时使用它。

于 2013-12-21T19:59:33.543 回答
2
    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);
于 2014-12-17T08:39:06.723 回答
2
    JScrollBar vbar = scrollPane.getVerticalScrollBar();

    for (int i = 0; i < 20; i++) {

        myJTxt.append("This is text " + i + "\n");
        vbar.setValue(vbar.getMaximum());
        vbar.paint(vbar.getGraphics());
        myJTxt.scrollRectToVisible(myJTxt.getVisibleRect());
        myJTxt.paint(myJTxt.getGraphics());
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ScrollTextView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
于 2009-11-15T00:26:47.400 回答
2

我尝试了大多数建议,但是当 JTextArea 的内容变大(几 MB)时遇到了问题。最后,以下显示了最佳性能:

myTextArea.append( someText );
myTextArea.getCaret().setDot( Integer.MAX_VALUE );

当然,用户所做的任何选择都会丢失。因此,它仅可用于文本区域的“仅显示”用途。

尽管如此,在我的安装中,如果 JTextArea 的内容超过 9MB,它就会变得有点不可用(非常迟钝到几乎冻结的 GUI)。

当文本包含由 UTF-16 编码中的两个字符(两个 16 位单元)表示的字符(所谓的代理对,例如:)时,会出现类似的现象。我有一个过滤解决方案,但可能是一个不同的主题。

于 2019-01-27T16:37:57.917 回答
0

最好和最简单的方法,试试这个:

  import javax.swing.text.DefaultCaret;
  DefaultCaret caret = (DefaultCaret) textArea.getCaret();
  caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
于 2020-09-08T04:07:44.897 回答
-2

改用这个

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);
于 2014-12-17T10:32:04.777 回答
-3

尝试这个:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
于 2013-11-14T13:03:56.603 回答