Atualizar JTextArea em Tempo Real

3 respostas
fenix.cwb

Olá Pessoal, preciso que um JTextArea Seja atualizado em tempo real, mas ela só atualiza no final do processamento.

Gostaria que atualizasse a cada linha, mas não ta indo.

Segue exemplo

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

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


public class TesteUpJTextArea implements ActionListener {

	private TextResults results;
	private JButton start;
	
	public TesteUpJTextArea(){
		
		results = new TextResults(10, 30);
		
		start = new JButton("Start");
		start.addActionListener(this);
		
		JPanel panel = new JPanel(new BorderLayout());
		panel.add(start, BorderLayout.NORTH);
		panel.add(results.getPanel(), BorderLayout.CENTER);
		
		JFrame frame = new JFrame();
		frame.setTitle("Teste");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(panel);		
		frame.pack();
		frame.setVisible(true);
		frame.setLocationRelativeTo(null);

	}
	
	public static void main(String args[]) {
		new TesteUpJTextArea();
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		if (event.getSource() == start){
			for (int i = 0; i < 10000; i++) {
				results.setResult("Linha" + (i + 1));
			}
			JOptionPane.showMessageDialog(null, "Fim de Atualização");
		}		
	}
	
}

class TextResults {
	
	private JTextArea out;
	private JPanel panel = new JPanel(new BorderLayout());
	private String text = "";
	private String intervalo = "\n";
	private int x;
	private int y;
	
	public TextResults(int x, int y) {
		this.x = x;
		this.y = y;
		out = new JTextArea(x, y);
		out.setEditable(false);
		out.setLineWrap(true);
		JScrollPane scroll = new JScrollPane(out);
		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		panel.add(scroll, BorderLayout.CENTER);
	}
	
	public void setResult(String addRel){
		text += addRel + intervalo;
		out.append(addRel + intervalo);
		out.select((text.length() -1), (text.length() -1));		
	}
	
	public JTextArea getOut() {
		return out;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	public void setIntervalo(String intervalo) {
		this.intervalo = intervalo;
	}

	public String getIntervalo() {
		return intervalo;
	}

	public JPanel getPanel() {
		return panel;
	}
}

Desde já, grato

3 Respostas

M

fenix.cwb:
Olá Pessoal, preciso que um JTextArea Seja atualizado em tempo real, mas ela só atualiza no final do processamento.

Gostaria que atualizasse a cada linha, mas não ta indo.

Tente o seguinte:

public void setResult(String addRel){   
        text += addRel + intervalo;   
        out.append(addRel + intervalo);   
        out.setCaretPosition(out.getText().length() - 1);  
    }

Deve funcionar…

E não esqueça de colocar limitadores de linha (CR+LF) no final de cada linha, senão vira uma linguiça sua String.

[]s.

fenix.cwb

Cara, valeu ae, mas não teve jeito.

Num fez diferença alguma.

Eric_Yuzo

Basicamente, o código do método “actionPerformed” é executado na thread do swing, portanto a tela só pode ser “repintada” quando o código do actionPerformed executa todo o processamento “pesado”.

Para que haja o efeito da inserção do texto em tempo real, é preciso que o processamento pesado seja executado em uma thread separada, desta forma a thread do swing fica liberada para redesenhar a tela.

Uma forma de criar esta nova thread é usar a classe SwingWorker.

Criado 14 de setembro de 2011
Ultima resposta 16 de set. de 2011
Respostas 3
Participantes 3