Pergunta

Eu incorporei um jtextarea em um jscrollPane e estou usando esse jtextarea para saída.

Eu quero que quando o OPUT vai além do tamanho da JTexTarea, os JTextarea Scrolls automaticamente para que o usuário não precise fazer rolagem manual para baixo para ver a saída recente.

Como eu posso fazer isso?

Eu já definei a propriedade AutoScroll de JTexTarea e JScrollPane como TRUE.

Foi útil?

Solução

Ao usar o JDK1.4.2 (ou anterior), a sugestão mais comum que você encontrará nos fóruns é usar o código como o seguinte:

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

No entanto, acabei de notar que, no JDK5, esse problema foi realmente resolvido por uma alteração da API. Agora você pode controlar esse comportamento definindo uma propriedade no DefaultCaret da área de texto. Usando esta abordagem, o código seria:

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

Observação:

A sugestão acima para definir a política de atualização do carro não funciona.

Em vez disso, você pode querer conferir Rolagem inteligente O que oferece ao usuário a capacidade de determinar quando a rolagem deve ser automática ou não.

Uma descrição mais detalhada da rolagem automática em uma área de texto pode ser encontrada aqui: Rolagem da área de texto

Outras dicas

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

Quando você clica em qualquer lugar sobre o JTEXTAREA, a rolagem automática é possível para ser interrompida. Como a posição do caret mudou uma vez, o ponto de visualização também mudou. Neste momento, você deve definir a posição de alerta quando acrescentar ou adicionar algum texto. No meu caminho, fiz o método, incluindo a posição intermediária e depois usá -lo quando qualquer coisa para ser adicionada ou anexada.

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

Tentei a maioria das sugestões, mas tive problemas quando o conteúdo da JTexTarea se torna grande (vários MB). Finalmente, o seguinte mostrou o melhor desempenho:

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

Obviamente, qualquer seleção que o usuário fez se perde. Portanto, é único para um uso "somente para exibição" da área de texto.

Ainda assim, na minha instalação, se o conteúdo da JTexTarea exceder cerca de 9 MB, fica meio inutilizável (muito lento para a GUI quase congelada).

Um fenômeno semelhante ocorre quando o texto contém caracteres representados por dois chars (duas unidades de 16 bits) na codificação UTF-16 (os chamados pares substitutos, como este: 🌹). Eu tenho uma solução para filtrar, mas talvez um tópico diferente.

Use this instead

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

Try this:

JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setViewport(jTextArea);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top