2009-10-26 22 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);