2009-10-26 87 views
57

我在JScrollPane中嵌入了一个JTextArea,并使用该JTextArea进行输出。如何在Java GUI中设置JTextArea的自动SCROLLING?

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

我该怎么做?

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

回答

130

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

一个这个话题的更详细的描述可以在这里找到:Text Area Scrolling

+0

@camickr,我无法访问的链接,我坐在一个企业防火墙后面。你可以发布重要的东西从那个链接,我会投票给你:)谢谢。 – 2009-10-27 03:42:28

+1

任何想法为什么这可能不工作(为什么它的价值表格是使用Netbeans构建器创建的)? – 2013-07-15 22:02:41

+0

@ cyber-monk,编号创建一个SSCCE。如果它仍然不起作用,那么你可以创建一个问题并发布你的SSCCE。 – camickr 2013-07-16 00:19:39

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); 
     } 
    } 
-3

试试这个:

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

不是.............. – mKorbel 2013-11-14 13:26:08

2

当你点击任何地方了JTextArea,自动滚动有可能被停止。因为脱字符号的位置一旦改变,观点也改变了。在这段时间,当你附加或添加一些文本时,你应该设置插入符的位置。在我的路上,我制作了包括设置插入位置的方法,然后在添加或追加任何内容时使用它。

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

使用这个代替

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