如何在Java GUI中设置JTextArea的自动滚动?

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

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

我该怎么做?

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


答案 1

使用 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);

注意:

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

相反,您可能希望查看智能滚动,它使用户能够确定何时应自动滚动。

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


答案 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);
        }
    }

推荐