He incrustado un JTextArea en un JScrollPane y estoy usando que JTextArea para la salida.

Quiero que cada vez que la salida va más allá del tamaño de la JTextArea, el JTextArea se desplaza automáticamente para que el usuario no tiene que hacer manual desplácese hacia abajo para ver la reciente salida.

¿Cómo puedo hacer eso?

Ya he establezca la propiedad autoscroll de ambos JTextArea y JScrollPane a la verdad.

7 Comentarios

  1. 145

    Cuando se utiliza JDK1.4.2 (o antes) el más común sugerencia que usted encontrará en los foros es utilizar un código como el siguiente:

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

    Sin embargo, he notado que en JDK5 este problema ha sido resuelto por un cambio de API. Ahora puede controlar este comportamiento mediante el establecimiento de una propiedad en la DefaultCaret del área de texto. Utilizando este enfoque, el código sería el siguiente:

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

    Nota:

    La anterior sugerencia para establecer el símbolo de intercalación en la política de actualización no funciona.

    Lugar es posible que desee comprobar hacia fuera Smart Desplazamiento que le da al usuario la capacidad de determinar cuándo el desplazamiento debe ser automática o no.

    Una descripción más detallada de desplazamiento automático en un área de texto se puede encontrar aquí: Área De Texto De Desplazamiento

    • no puedo acceder al link, estoy sentado detrás de un firewall corporativo. Puedes publicar cosas importantes a partir de ese vínculo,y voy hasta votar:) Gracias.
    • Alguna idea de por qué esto no podría ser de trabajo (para lo que vale el formulario fue creado usando el Netbeans builder)?
    • No. Crear un SSCCE. Si aún así no funciona, entonces usted puede crear una pregunta y publicar sus SSCCE.
    • He quitado a su lado una nota de su respuesta – si esto es todavía un problema, publicar algo en Meta de Desbordamiento de Pila.
    • De acuerdo con el artículo en el área de texto de desplazamiento que se hace referencia en su respuesta, la configuración de intercalación en la política de actualización ya no funciona. Es probable que la mejor manera de seguir con la configuración de la posición del cursor de forma explícita.
  2. 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. 2

    Cuando usted haga clic en cualquier lugar a través de JTextArea, auto-desplazamiento de tener que detenerse. Debido a la posición del símbolo de intercalación de una vez cambiado, el punto de vista cambiado demasiado. En este momento debe establecer la posición del cursor cuando se anexan o añadir un poco de texto. En mi camino, me hizo método incluye juego de posición del cursor y, a continuación, utilizarlo cuando nada para ser agregado o añadido.

  4. 1
        JTextArea jTextArea = new JTextArea();
        DefaultCaret caret = (DefaultCaret)jTextArea.getCaret();
        caret.setUpdatePolicy(DefaultCaret.OUT_BOTTOM);
  5. 0

    He probado la mayoría de las sugerencias, pero surgieron problemas cuando el contenido de la JTextArea se hace más grande (varios MB). Finalmente, el siguiente mostró el mejor rendimiento:

    myTextArea.append( someText );
    myTextArea.getCaret().setDot( Integer.MAX_VALUE );

    Por supuesto, cualquier selección que el usuario había hecho que se pierde. Por lo tanto, sólo es útil para un «display» solo para uso del área de texto.

    Todavía, en mi instalación, si el contenido de la JTextArea supera algunos 9MB, se obtiene el tipo de la inservible (muy lento para casi congelada GUI).

    Un fenómeno similar se produce cuando el texto contiene caracteres que están representados por dos caracteres (dos de 16 bits unidades) en la codificación UTF-16 (los llamados pares suplentes, así: 🌹). Yo tengo una solución para el filtrado, pero tal vez un tema diferente.

  6. -2

    Usar este 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);
  7. -3

    Intente esto:

    JTextArea jTextArea = new JTextArea();
    JScrollPane jScrollPane = new JScrollPane();
    jScrollPane.setViewport(jTextArea);
    • no …………..

Dejar respuesta

Please enter your comment!
Please enter your name here