如何在Java GUI中设置JTextArea的AUTO-SCROLLING?

时间:2009-10-26 20:04:51

标签: java user-interface swing jscrollpane jtextarea

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

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

我该怎么做?

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

8 个答案:

答案 0 :(得分:142)

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

注意:

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

相反,您可能需要查看Smart Scrolling,这样用户就可以确定何时自动滚动。

有关文本区域自动滚动的更详细说明,请访问:Text Area Scrolling

答案 1 :(得分: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);
        }
    }

答案 2 :(得分:2)

单击JTextArea上的任意位置时,可以停止自动滚动。因为插入符的位置一旦改变,观点也发生了变化。在这段时间,您应该在追加或添加一些文本时设置插入位置。在我的路上,我制作了包括设置插入位置的方法,然后在要添加或附加任何内容时使用它。

答案 3 :(得分:1)

    JTextArea jTextArea = new JTextArea();
    DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
    caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);

答案 4 :(得分:0)

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

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

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

仍然,在我的安装中,如果JTextArea的内容超过9MB,它将变得无法使用(非常缓慢甚至几乎冻结的GUI)。

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

答案 5 :(得分:0)

最好,最简单的方法,试试看:

  import javax.swing.text.DefaultCaret;
  DefaultCaret caret = (DefaultCaret) textArea.getCaret();
  caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

答案 6 :(得分:-2)

改为使用

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
scrollPane = new JScrollPane();
scrollPane.add(textArea);
scrollPane.setViewportView(textArea);

答案 7 :(得分:-3)

试试这个:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);