2010-03-20 14 views

risposta

33

Per (quello che penso sia) una risposta semplice check-out: Text Area Scrolling.

Prima di JDK5, è necessario modificare manualmente la posizione del cursore dopo ogni aggiunta. È ora possibile dare a questo comportamento come predefinito in questo modo:

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

Il vantaggio di questo è che non è necessario utilizzare questo frammento più di una volta nel codice!

+0

+1 L'API 'setUpdatePolicy()' spiega molto _so_. Ho aggiornato la mia risposta alla domanda citata di conseguenza. – trashgod

+0

Sì, l'API continua a cambiarla per tenere il passo con le modifiche in ogni momento. – camickr

+0

Questo aiuta, ma se gli utenti fanno clic in un punto diverso da quello successivo alla fine dell'ultima riga, lo scorrimento automatico si interrompe. Questo non è intuitivo. Sarebbe bello se funzionasse il solito comportamento, semplicemente scorrendo verso il basso l'auto-scroll viene riattivato. – jcalfee314

6

ho trovato la risposta qui: JScrollPane and JList auto scroll

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      e.getAdjustable().setValue(e.getAdjustable().getMaximum()); 
     } 
    }); 
+5

tua "soluzione" è in realtà il problema del collegato-alla domanda: se si tenta manualmente di spostare la maniglia di scorrimento verticale, questo codice scorrerà di nuovo verso il basso! – jackrabbit

1

Un'opera è intorno possibile: si può dichiarare che ascoltatore come una classe allora un'istanza sull'evento dove è necessario. Dopo di che è possibile rimuovere la classe dopo aver forzato un ridisegno dello schermo. Funziona come un fascino.

5

Se siete costantemente la scrittura dei dati ad esso si può utilizzare:

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

solo dopo aver aggiunto i nuovi dati.

Questo si scorrerebbe automaticamente fino a JScorllPane.

+1

mentre possibile, non è la soluzione migliore - che è la risposta di @camickr :-) – kleopatra

+0

+1 per un buon lavoro. –

4

Ecco la soluzione.

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

Questo è solo codice, nessuna descrizione, quindi nessuna risposta. –

+0

+1 per la risposta corretta - anche se è la stessa della risposta accettata da Rob :-) – kleopatra

0

La mia soluzione Screen Shoot

Alternative SC Link (PS: Edit per SCREEN SHOOT)

import javax.swing.*; 
import javax.swing.text.DefaultCaret; 

public class NewClass { 

    public static void main(String[] args) { 
     JFrame win = new JFrame("test"); 
     win.setSize(800, 500); 
     win.setResizable(false); 
     win.setLayout(null); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.setLocationRelativeTo(null); 

     JTextArea txtListNum = new JTextArea(); 
     JScrollPane barList = new JScrollPane(txtListNum); 
     DefaultCaret crList = (DefaultCaret) txtListNum.getCaret(); 
     crList.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 

     barList.setLocation(10, 10); // Scrollbar Position 
     barList.setSize(180, 450); // Scrollbar Dimession 
     win.add(barList);   // Scrolbar add to Frame 

     win.setVisible(true); 

    } 

} 
Problemi correlati