2011-12-22 13 views
5

Duplicar posibles:
How to set AUTO-SCROLLING of JTextArea in Java GUI?Cómo llegar al final de la TextArea

Estoy creando una aplicación en la que el usuario escribe el texto en un TextField de la cual el texto se agrega a un TextArea cuando actionPerformed.
Se agrega TextArea en un JScrollPane. Cuando la cantidad de líneas fuera de la columna declarada, el usuario puede desplazarse para ver el texto. Pero necesita desplazarse cada vez que ingresa texto en TextArea a través de TextField porque la última línea anexa al TextArea no se desplaza automáticamente a la última línea.
¿Alguien me puede ayudar de forma automática o cuando la acción realizada, el TextArea se desplazará para durar?

+0

Un truco rápido será 'jTextArea.selectAll();' –

Respuesta

3

Prueba esto:

jTextArea.selectAll(); 
int last = jTextArea.getSelectionEnd(); 
jTextArea.select(last, last); 

Dónde jTextArea es una referencia a su TextArea.

Sin embargo, el ejemplo anterior podría ser extremadamente lento si hay una gran cantidad de texto, por lo que he proporcionado otra manera de hacer esto:

jTextArea.setCaretPosition(jTextArea.getDocument().getLength()); 

EDIT: después de navegar alrededor en el Internet para soluciones alternativas y leyendo this answer to a similar question, me di cuenta de que la solución de @Kleopatra es la más efectiva. Sin embargo, es totalmente su prerrogativa aceptar cualquier respuesta que considere adecuada (veo que ha aceptado la mía).

@kleopatra Te giré de arriba para compensarlo. :)

+0

Por qué no sólo 'JTextArea .setCaretPosition (jTextArea.getText(). length()); '? – DRCB

+0

@DRCB Oh, cierto, lol. Editado – fireshadow52

+0

@DRCB, no, no debe usar getText(). Length(). Esto causa un trabajo innecesario para reconstruir la cadena de texto del documento. En su lugar, puede usar getDocument(). GetLength(), que hace lo mismo pero es más eficiente. – camickr

5

la magia reside en el DefaultCaret.updatePolicy:

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

para más detalles, véase también Rob's blog entry

Cuestiones relacionadas