Listar dados em JTextArea

Pessoal,

Quando tenho fazer a listagem abaixo na JTextArea, o programa somente mostra a lista quando o laco termina. Alguem sabe o que devo fazer para que a listagem seja feita enquanto o for esta executando, ou seja, linha a linha sendo impressa passo a passo na tela ? :roll:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        
        jTextArea1.removeAll();
        
        for(int i=0; i<100000; i++)
        {
            jTextArea1.append("teste\n");
        }   
    }      

se vc usar:

até mais.

nao funcionou. O programa travou :cry:

aí amigo, segue um exemplo que funciona, veja se é isto que você precisa !!!

[code]import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Teste {

public static void main(String[] args) {
	JFrame f = new TesteFrame();
	f.setVisible(true);
}

}

class TesteFrame extends JFrame {

private static final long serialVersionUID = 1L;

private JTextArea areaTexto = new JTextArea();

public TesteFrame() {

	setSize(230, 290);
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setTitle("Teste Area");
	setLocationRelativeTo(null);
	setResizable(false);

	JScrollPane scrollAreaTexto = new JScrollPane(areaTexto);

	JButton botaoAcao = new JButton("Povoar Lista");

	getContentPane().setLayout(null);

	scrollAreaTexto.setBounds(10, 10, 200, 200);
	areaTexto.setLineWrap(true);

	botaoAcao.setBounds(10, 220, 200, 25);
	botaoAcao.addActionListener(new CliqueBotao());

	getContentPane().add(scrollAreaTexto);
	getContentPane().add(botaoAcao);

}

class CliqueBotao implements ActionListener {

	public void actionPerformed(ActionEvent arg0) {

		// limpa a area
		areaTexto.setText("");

		for (int i = 0; i < 2000; i++) {

			areaTexto.append("" + i);

		}

	}

}

}
[/code]

o problema ainda continua :cry: coloque a condicao do laco como abaixo e voce vai ver que o problema nao foi resolvido :cry:

for (int i = 0; i < 200000; i++) {   
  
                areaTexto.append("" + i);   
  
            }   

Entendi, é um valor bastante grande.

Veja as minhas mudanças(linhas 21, 58)

Faça o seu teste novamente…

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Teste {

	public static void main(String[] args) {
		JFrame f = new TesteFrame();
		f.setVisible(true);
	}
}

class TesteFrame extends JFrame {

	private static final long serialVersionUID = 1L;

	private JTextArea areaTexto = new JTextArea(20000000, 20000000);

	public TesteFrame() {

		setSize(230, 290);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setTitle("Teste Area");
		setLocationRelativeTo(null);
		setResizable(false);

		JScrollPane scrollAreaTexto = new JScrollPane(areaTexto);

		JButton botaoAcao = new JButton("Povoar Lista");

		getContentPane().setLayout(null);

		scrollAreaTexto.setBounds(10, 10, 200, 200);
		areaTexto.setLineWrap(true);

		botaoAcao.setBounds(10, 220, 200, 25);
		botaoAcao.addActionListener(new CliqueBotao());

		getContentPane().add(scrollAreaTexto);
		getContentPane().add(botaoAcao);

	}

	class CliqueBotao implements ActionListener {

		public void actionPerformed(ActionEvent arg0) {

			// limpa a area
			areaTexto.setText("");

			int contDescarga = 0;
			StringBuffer buffer = new StringBuffer();

			for (long i = 0; i < 200000; i++) {

				buffer.append(i + "");

				contDescarga = (contDescarga + 1);

				if (contDescarga >= 500) {

					areaTexto.append(buffer.toString());
					contDescarga = 0;
					buffer.delete(0, buffer.length());

				}

			}

		}

	}

}

nao resolveu o problema :cry:

Então Pepe, aqui para mim mostra os valores, você executou o meu exemplo ? Como ele se comportou ?

Podemos fazer diferente, qual a sua necessidade específica em fazer isso ?

Aguardo.

Abraço,
Lucas

tudo bem ele mostra os valores, mas nao enquanto o laco esta em execucao. Ele somente mostra os valores quando o laco termina. Imagine, por exemplo, o linux, quando vc entra no modo terminal e digita ls ou no windows na tela do dos digita dir, o sistema mostra os valores(dados) sendo listados. Estou tentando fazer algo dessa forma. Quero que o usuario veja o processo de listagem dos dados e nao somente os dados ja listados.

acho que o nome desse processo eh “show live data”

Entendo Pepe, mas o que acontece é que o valor é muito grande, então fica realmente lento.
Imagine, 200000 dearquivos sendo listados num dir ou ls, é muita coisa não é mesmo ? Dificilmente tu vai ter uma situação deste tipo.
O que tu pode fazer é limitar este valor, esta seria a minha solução.

Por exemplo, se o resultado do “ls” ou “dir” ultrapassar 20000 arquivos, você pede para o usuário ser mais específico na pesquisa.

Exemplo:

ls -tl *.txt

ou

dir *.exe

Entende ?

O que você acha ?

entendo o que voce quis dizer. Realmente fica lento, mas mesmo assim o usuario ve que esta se passando alguma coisa na tela, ou seja, dados sendo mostrados rapidamente. No caso do nosso programa nem isso ta acontecendo. :wink:

Pepe, é estranho pois aqui para mim ele lista mesmo com o tamanho grande…

Não lista somente no fim do FOR, vai listando bem devagar, mas lista, vc aumentou o tamanho da JtextArea(20000000,20000000) ?

Qual é a configuração da máquina que você está rodando ? (processador, memória), isso pode influenciar.

A minha máquina aqui é um Core 2 Quad com 2 GB de RAM…