2009-10-26 11 views
57

Ho incorporato un JTextArea su un JScrollPane e sto usando quel JTextArea per l'output.Come impostare AUTO-SCROLLING di JTextArea nella GUI Java?

Voglio che quando l'output supera la dimensione di JTextArea, il JTextArea scorre automaticamente in modo che l'utente non debba eseguire lo scroll manuale verso il basso per vedere l'output recente.

Come posso farlo?

Ho già impostato la proprietà autoscroll di JTextArea e JScrollPane su true.

risposta

130

quando si utilizza JDK1.4.2 (o prima) il suggerimento più comune si trovano nei forum è quello di utilizzare il codice simile al seguente:

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

Tuttavia, ho appena notato che in questa edizione ha JDK5 effettivamente risolto da una modifica dell'API. È ora possibile controllare questo comportamento impostando una proprietà su DefaultCaret dell'area di testo. Usando questo approccio il codice sarebbe:

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

Una descrizione più dettagliata di questo argomento si possono trovare qui: Text Area Scrolling

+0

@camickr, non riesco a vedere il link, mi sono seduto dietro un firewall aziendale. Puoi pubblicare cose significative da quel link, e io ti voterò :) Grazie. –

+1

Qualche idea sul perché questo potrebbe non funzionare (per quello che vale il modulo è stato creato usando il builder Netbeans)? –

+0

@ cyber-monaco, No. Creare un SSCCE. Se continua a non funzionare, puoi creare una domanda e pubblicare il tuo SSCCE. – camickr

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

Prova questa:

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

non .............. – mKorbel

2

Quando si fa clic in un punto qualsiasi JTextArea, lo scorrimento automatico può essere fermato. Poiché la posizione del punto di inserimento una volta è cambiata, anche il punto di vista è cambiato. In questo momento dovresti impostare la posizione del punto di inserimento quando aggiungi o aggiungi del testo. Sulla mia strada, ho fatto un metodo che includeva la posizione di inserimento del cursore, e quindi l'ho usato quando qualcosa da aggiungere o aggiungere.

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

Utilizzare questo invece

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