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…
[RESOLVIDO] JScrollPane mostra ultimo item da lista
23 Respostas
mas isso é pra JTable… o meu é JArea… não tenho colunas
Oi,
Eu sei… dessa maneira.:
Tchauzin!
acho q isso soh funciona pra tabela, mas não pra JTextArea!!!
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!
o autoscroll tb não funciona… quem dá mais?
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.
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
E quem disse que tem que criar outra classe, “minha cara”?
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?
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?
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<String> it = lista.iterator(); it.hasNext();){
areaWriter.println(it.next());
}//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);
}
Tah, vou tentar e jah te falo!
Obrigada
Então, dah erro nessa linha
PrintWriter areaWriter = new PrintWriter(new TextComponentWriter(area)); // can not find symbol
Você adicionou a classe do link no seu projeto?
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
Se vc fizer este metodo cada vez que adicionar algo tb funciona
Crie um arquivo chamado TextComponentWriter.java
Recorte a classe desse link:
http://www.guj.com.br/posts/list/135749.java#730553
Cole.

Mas quanto a parte new Point…
Fala can not find symbol…
desculpa, mas sou novata nisso
:?
José me ajudou, deu certinho, mas valeu Vinny!!!
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.
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…
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…