2010-03-20 24 views

Respuesta

33

Por (lo que creo que es) una respuesta más simple salida: Text Area Scrolling.

Antes de JDK5, debería cambiar manualmente la posición de la referencia después de cada anexión. Ahora usted puede dar este comportamiento por defecto de esta manera:

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

La ventaja de esto es que no es necesario utilizar este fragmento más de una vez en su código!

+0

+1 La API 'setUpdatePolicy()' explica _so_ much. He actualizado mi respuesta a la pregunta citada en consecuencia. – trashgod

+0

Sí, la API cambia continuamente para mantenerse al día con los cambios todo el tiempo. – camickr

+0

Esto ayuda, pero si los usuarios hacen clic en cualquier lugar que no sea el final de la última línea, el desplazamiento automático se detiene. Esto no es intuitivo. Sería bueno si el comportamiento habitual funcionó, simplemente al desplazarse hacia abajo, el auto-scroll se reactiva. – jcalfee314

6

he encontrado la respuesta aquí: JScrollPane and JList auto scroll

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

Su "solución" es en realidad el problema de la ligada a la pregunta: si intenta manualmente para mover el asa de desplazamiento vertical, este código se desplazará al fondo nuevamente! – jackrabbit

1

Es posible evitarlo: puede declarar ese oyente como una clase y luego crear una instancia en el evento donde sea necesario. Después de lo cual puede eliminar la clase después de forzar el repintado de la pantalla. Funciona de maravilla.

5

Si usted está constantemente escribiendo datos en ella puede usar:

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

justo después de agregar los nuevos datos.

Esto se desplazará automáticamente por todo el JScorllPane.

+1

mientras sea posible, no es la mejor solución, que es la respuesta de @camickr :-) – kleopatra

+0

+1 por un buen trabajo. –

4

Aquí está la solución.

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

Esto es solo código, sin descripción, por lo tanto, no hay respuesta. –

+0

+1 para la respuesta correcta, aunque es lo mismo que la respuesta aceptada por Rob :-) – kleopatra

0

Mi solución Screen Shoot

Alternative SC Link (PS: Edición de lanzamiento de la pantalla)

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

    } 

} 
Cuestiones relacionadas