[RESOLVIDO] JScrollPane mostra ultimo item da lista

23 respostas
oitathi

Alguém sabe como q eu faço pra o meu scrollPane ir se movimentando para que sempre a ultima linha seja mostrada?
Ou seja, como eu faço pra quando eu tiver um JArea que tah dentro de um JScrollPane mostrar meu ultimo item incluso em uma lista?
Pq a medida que eu vou inserindo itens na na TextArea, o scrollpane vai subindo, mas o conteudo dela não…

23 Respostas

E

http://www.exampledepot.com/egs/javax.swing.table/Vis.html

oitathi

mas isso é pra JTable… o meu é JArea… não tenho colunas

lina

Oi,

Eu sei… dessa maneira.:

Tchauzin!

oitathi

acho q isso soh funciona pra tabela, mas não pra JTextArea!!!

lina

Oi,

Nossa! Foi mal!!! não tinha visto…

Então, para o JTextAre tem um lance de setAutoScroll(true), se eu não me engano!

Estou sem IDE no momento. Assim que possível lhe informarei o certo!

Tchauzin!

oitathi

o autoscroll tb não funciona… quem dá mais?

ViniGodoy

Por que você não usa o componente que te passei no outro post?
http://www.guj.com.br/posts/list/135749.java#730553

Ele não só ajuda você a escrever no JTextArea como já faz o auto-scroll! Em todo caso, bastava olhar no código dele para ver a parte do auto-scroll.

oitathi

eu não consigo utilizar o seu código na minha aplicação meu caro, eu jah tô extendendo uma classe na classe que eu tenho a minha text area e eu não quero cria outra classe soh pra fazer isso.
Grata pela ajuda

ViniGodoy

E quem disse que tem que criar outra classe, “minha cara”?

oitathi

pq o que eu crio eh o seguinte:

area = new JTextArea();
area.setBackground(new Color(209,223,236));
area.setEditable(false);
area.setFont(new Font("arial",Font.PLAIN,14));
scrollArea=new JScrollPane(area);
scrollArea.setSize(600,160);
scrollArea.setLocation(42,265);
add(scrollArea);
contaLinha(linha);

 public void completaArea(LinkedList lista){
            area.setText("");
            for(Iterator<String> it = lista.iterator(); it.hasNext();){
              area.append(it.next());
              area.append("\n");
           }//end for
        }//end metodo

 public void contaLinha (String linha){
            if(lista.size()<300){
               lista.addLast(linha);
            }//end if
            else{
                lista.removeFirst();
                lista.addLast(linha);
            }//end else
            completaArea(lista);
        }

E isso já tah funcionando muito bem para o que eu quero, pois como eu disse, eu preciso de que quando minha qtd de elementos for maior q 300, o meu primeiro item seja apagado.
Não quero mudar a aplicação todo, entende?

ViniGodoy

O que aquele componente faz é permitir que você use o JTextArea (ou qualquer outro JTextComponent, como o JTextPane) como se fosse um Writer. É exatamente o que você precisa.

Ele já controla fluxos muito rápidos de texto, e também controla o auto-scroll. Para isso, você não vai criar classe extra nenhuma. Não sei de onde você tirou essa idéia.

O que você vai fazer é adiciona na sua classe um:

Depois da criação do JTextArea, você associa esse writer ao JTextArea:

E, na hora de escrever no JTextArea, ao invés de usar o método append, você usa qualquer método de print que você usaria no console:

areaWriter.println("Esse texto será escrito no JTextArea..."); areaWriter.printf("Esse aqui é %d!!!%n", 10);

O areaWriter já fará o auto-scroll automaticamente.

Ao invés de ignorar solenemente a sugestão dos outros só porque você não entendeu (e nem tentou entender) como ela funciona, por que você simplesmente não pergunta?

ViniGodoy
Qual é a grande mudança?
area = new JTextArea();
area.setBackground(new Color(209,223,236));
area.setEditable(false);
area.setFont(new Font("arial",Font.PLAIN,14));
areaWriter = new PrintWriter(new TextComponentWriter(area));

scrollArea=new JScrollPane(area);
scrollArea.setSize(600,160);
scrollArea.setLocation(42,265);
add(scrollArea);
contaLinha(linha);

 public void completaArea(LinkedList lista){
            area.setText("");
            for(Iterator&lt;String&gt; it = lista.iterator(); it.hasNext();){
              areaWriter.println(it.next());
           }//end for
        }//end metodo

 public void contaLinha (String linha){
            if(lista.size()&lt;300){
               lista.addLast(linha);
            }//end if
            else{
                lista.removeFirst();
                lista.addLast(linha);
            }//end else
            completaArea(lista);
        }
oitathi

Tah, vou tentar e jah te falo!
Obrigada

oitathi

Então, dah erro nessa linha

PrintWriter areaWriter = new PrintWriter(new TextComponentWriter(area));   // can not find symbol
ViniGodoy

Você adicionou a classe do link no seu projeto?

oitathi

vc vai me bater se eu fizer a fatídica pergunta: que link? :shock:
Se vc tah se referindo ao texto que chega… ele tah chegando como parametro

Jose111

Se vc fizer este metodo cada vez que adicionar algo tb funciona

ViniGodoy

Crie um arquivo chamado TextComponentWriter.java

Recorte a classe desse link:
http://www.guj.com.br/posts/list/135749.java#730553

Cole.

:slight_smile:

oitathi

Mas quanto a parte new Point
Fala can not find symbol…
desculpa, mas sou novata nisso
:?

oitathi

José me ajudou, deu certinho, mas valeu Vinny!!!

ViniGodoy

A linha que ele postou faz exatamente o mesmo que a que eu postei:

O problema é que o auto-scroll do JTextArea não funciona corretamente sem que você altere a posição do caret. Já tive problemas com o método o José.

oitathi, eu trabalhava recebendo fluxos de dados de um protocolo no JTextArea, mais ou menos como você está querendo fazer. Também limitavamos o conteúdo do JTextArea a um número máximo de linhas, e controlamos entradas que vinham muito rapidamente pela rede.

A diferença é que usavamos no lugar de um JTextArea um jTextPane, porque ele permite formatação. Desse projeto, surgiu até esse editor de texto com syntax highlight.

Eu ainda recomendo que você use o TextComponentWriter porque ele trata outro problema do JTextArea. Se o fluxo de dados for muito veloz, você vai começar a ver problemas na renderização do componente. O que o writer faz também, é garantir que o fluxo não seja maior do que uma mensagem a cada 0.5 segundos. Para isso, ele usa uma thread que acumula tudo que chegar nesse intervalo e adiciona tudo de uma só vez, quando o tempo passar.

Jose111

Hum não sabia disso … estranho o JtextArea não ter uma função que faça isso automaticamente.

Acho que as vezes falta alguns facilitadores nos componentes do Swing…

ViniGodoy

Jose111:
Hum não sabia disso … estranho o JtextArea não ter uma função que faça isso automaticamente.

Acho que as vezes falta alguns facilitadores nos componentes do Swing…

Não ter esses facilitadores é uma das coisas que odeio em java

Criado 29 de julho de 2010
Ultima resposta 30 de jul. de 2010
Respostas 23
Participantes 5