2009-10-26 10 views
57

He incrustado un JTextArea en un JScrollPane y estoy usando ese JTextArea para la salida.Cómo configurar el AUTO-SCROLLING de JTextArea en Java GUI?

Quiero que cada vez que la salida exceda el tamaño de JTextArea, JTextArea se desplace automáticamente para que el usuario no tenga que desplazarse manualmente hacia abajo para ver la salida reciente.

¿Cómo puedo hacer eso?

Ya he configurado la propiedad autoscroll de JTextArea y JScrollPane como verdadera.

Respuesta

130

cuando se utiliza JDK1.4.2 (o anterior) la sugerencia más común que se encuentra en los foros es usar un código como el siguiente:

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

Sin embargo, sólo me he dado cuenta de que en esta edición tiene JDK5 en realidad se resolvió mediante un cambio de API. Ahora puede controlar este comportamiento estableciendo una propiedad en DefaultCaret del área de texto. Utilizando este enfoque, el código sería:

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

Una descripción más detallada de este tema se puede encontrar aquí: Text Area Scrolling

+0

@camickr, no puedo acceder al enlace, estoy sentado detrás de un cortafuegos corporativo. ¿Puedes publicar cosas importantes de ese enlace? Y te votaré :) Gracias. –

+1

¿Alguna idea de por qué esto podría no estar funcionando (para lo que vale la pena, el formulario se creó usando el creador de Netbeans)? –

+0

@ cyber-monk, No. Crea un SSCCE. Si todavía no funciona, puede crear una pregunta y publicar su 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

Prueba esto:

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

no .............. – mKorbel

2

Al hacer clic en cualquier lugar a través JTextArea, el desplazamiento automático puede detenerse. Debido a que la posición del cursor una vez cambió, el punto de vista también cambió. En este momento, debe establecer la posición de intercalación cuando agregue o agregue texto. En el camino, hice un método que incluye establecer la posición de intercalación, y luego usarlo cuando se agregue o adjunte algo.

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

Use esto en lugar

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