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");
}
}
nao funcionou. O programa travou
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 coloque a condicao do laco como abaixo e voce vai ver que o problema nao foi resolvido
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());
}
}
}
}
}
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.
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…