Componentes JTextArea não é atualizado

Olá pessoal, alguém sabe me dizer porque o JTextArea não é atualizado como o System.out.println()???
O valor que eu mando imprimir no txt.setText() somente é impresso após a finalização da execução dos fors.
Fiz um exemplo bem básico para expressar a minha dúvida.


import java.awt.FlowLayout;
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 extends JFrame {

	private JButton botao = new JButton("Executar");
	private JTextArea txt = new JTextArea(20, 20);
	private JScrollPane scroll = new JScrollPane();
	
	public Teste() {
		super();
		init();
	}

	private void init() {
		setSize(400, 500);
		setLayout(new FlowLayout());

		scroll.getViewport().add(txt);
		add(scroll);
		botao.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				executarFors();
			}
		});
		
		add(botao);
	}
	
	private void executarFors() {
		for (int i = 0; i < 300; i++) {
			txt.setText(txt.getText() + "Executando o primeiro for\n");
			System.out.println("Executando o primeiro for"  + i);
		}
		
		for (int i = 0; i < 300; i++) {
			txt.setText(txt.getText() +  "Executando o segundo for\n");
			System.out.println("Executando o segundo for" + i);
		}
		
		for (int i = 0; i < 300; i++) {
			txt.setText(txt.getText() + "Executando o terceiro for\n");
			System.out.println("Executando o terceiro for"  + i);
		}
	}
	
	public static void main(String[] args) {
		Teste teste = new Teste();
		teste.setVisible(true);
		teste.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
}

é uma dúvida parecida com a de um outro membro hoje…

a resposta do Marky.Vasconcelos foi a seguinte

ou seja… ele executa todo o for antes de ‘repintar’ a interface gráfica

ta aí o link

http://www.guj.com.br/java/242208-existe-algum-metodo-para-atualizar-um-jpanel-a-cada-loop-de--um-laco-for

o caso é diferente mas acho que o problema é o mesmo

abraço!

O link não ajudou, pois aparenta ser muito mais complexo do que eu preciso.
O que eu estou precisando é simplestmente atualizar o txt a cada iteração do for.

Rode seu código numa thread separada. Use o método append do JTextArea pois ele é thread-safe e evita aquele monte de concatenação feia ali.

[code] private void executarFors() {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 300; i++) {
txt.append("Executando o primeiro for\n");
System.out.println("Executando o primeiro for" + i);
}

          for (int i = 0; i &lt; 300; i++) {  
              txt.append(&quot;Executando o segundo for\n&quot;);  
              System.out.println(&quot;Executando o segundo for&quot; + i);  
          }  
      
          for (int i = 0; i &lt; 300; i++) {  
             txt.setText(&quot;Executando o terceiro for\n&quot;);  
             System.out.println(&quot;Executando o terceiro for&quot;  + i);  
        }  
 }).start();   

} [/code]

Outra opção é usar esse writer associado ao seu JTextArea:
http://www.guj.com.br/java/83462-ajuda-com-um-jtextarea-especial#445238

[code]private void executarFors() {
PrintWriter out = new PrintWriter(new TextComponentWriter(txt));
for (int i = 0; i < 300; i++) {
out.println("Executando o primeiro for" + i);
System.out.println("Executando o primeiro for" + i);
}

for (int i = 0; i &lt; 300; i++) {  
    out.println(&quot;Executando o segundo for&quot; + i);  
    System.out.println(&quot;Executando o segundo for&quot; + i);  
}  
      
for (int i = 0; i &lt; 300; i++) {  
    out.println(&quot;Executando o terceiro for&quot;  + i);  
    System.out.println(&quot;Executando o terceiro for&quot;  + i);  
}  
out.close();

} [/code]

Muito obrigado Vinigodoy e digaoneves…

Usei a seguinte implementação do Vinigodoy:

     public void exportarButton() {       
          new Thread(new Runnable() {
               public void run() {
                 Configurator.configureExportarPanelEdit(ContextExportarDadosPanelEdit.EXPORTAR, exportarDadosPanelEdit, 
                 exportarDadosPanelEdit.getArquivosIntercambioPanel());
                 
                 exportarXmlSemWhere("ICATB_RESERVATORIO");
                 exportarParaXmlComWhere("ICATB_ESTACAO", "EST_ID", listaEstId());   
                 exportarParaXmlComWhere("HDRTB_EST_LOCAL_POLIT_HIDRG", "EPH_EST_ID", listaEstId());
                 exportarParaXmlComWhereSubBacia("HDRTB_SUBBACIA_RIO", listaEphDnsCd, listaEphRioCd);
                 exportarParaXmlComWhere("ICATB_AREA_DRENAGEM", "ARD_EST_ID", listaEstId());
                 exportarParaXmlComWhere("ICATB_HIST_COORD_ESTACAO", "HCE_EST_ID", listaEstId());
                 exportarParaXmlComWhere("ICATB_HISTORICO_ESTACAO", "HSE_EST_ID", listaEstId());
                 exportarParaXmlComWhere("ICATB_IMAGEM", "IMG_EST_ID", listaEstId());
                 
                 exportarParaXmlComWhere("ICATB_SECAO_TRANSVERSAL", "SCT_EST_ID", listaEstId());  
                 exportarParaXmlComWhere("ICATB_SECAO_REGUA", "SCR_SCT_ID", listaSctId);
                 exportarParaXmlComWhere("ICATB_LINHA_BASE", "LNB_SCT_ID", listaSctId); 
                 exportarParaXmlComWhere("ICATB_LANCE_REGUA", "LCR_SCR_ID", listaScrId);
                 exportarParaXmlComWhere("ICATB_MARGEM", "MAR_SCT_ID", listaSctId);
                 exportarParaXmlComWhere("ICATB_NATUREZA_MARGEM", "NTM_MAR_ID", listaMarId);
                 exportarParaXmlComWhere("ICATB_NATUREZA_LEITO", "NTL_SCT_ID", listaSctId);
                        
                 exportarParaXmlComWhere("ICATB_CARACTERIZACAO_VHM", "CVH_EST_ID", listaEstId());
                 exportarParaXmlComWhere("ICATB_HIST_COORDENADA_CVHM", "HCC_CVH_ID", listaCvhId);
                 exportarParaXmlComWhere("ICATB_HIST_OBSERVADOR_CVHM", "HSO_CVH_ID", listaCvhId);
                 exportarParaXmlComWhere("ICATB_OBSERVADOR", "OBS_ID", listaHsoObsId);
                 exportarParaXmlComWhere("ICATB_ENDERECO", "END_OBS_ID", listaHsoObsId);
                 exportarParaXmlComWhere("ICATB_HISTORICO_OPERACAO", "HOC_CVH_ID", listaCvhId);
                 
                 exportarXmlSemWhere("ICATB_LABORATORIO");
                 exportarParaXmlComWhere("ICATB_RESPONSAVEL_LABORATORIO", "RPL_LAB_ID", listaLabId);
                 exportarParaXmlComWhere("ICATB_ENDERECO_LABORAT", "ENL_LAB_ID", listaLabId);
                 exportarParaXmlComWhere("ICATB_ENDERECO_RESP_LABORAT", "ENR_RPL_ID", listaRplId);
                 
                 ADFExceptionHandler.displayMessage("Operação realizada com sucesso.");
                 Configurator.configureExportarPanelEdit(ContextExportarDadosPanelEdit.ABRIR, exportarDadosPanelEdit, 
                 exportarDadosPanelEdit.getArquivosIntercambioPanel());
               }
          }).start();
     }  
    /**
     * Exporta os registros de estação com where
     */
     private void exportarParaXmlComWhere(String nomeTabela, String chave, List<String> listaDeIds) {
        Connection con = null;
                        
         try {
           
              con = getConnection();
              Statement stmt = con.createStatement();
              
              String strIdsSelecionados = "";
              List<String> idSelecionados = listaDeIds;
              
              if (idSelecionados.size() > 0) {
              
                 for (String i : idSelecionados) {
                      strIdsSelecionados += i;
                      strIdsSelecionados += ", ";                   
                 }        
      
                 strIdsSelecionados += ";";
                 //remove o último espaço e última vírgula
                 String resIdSelecionados = strIdsSelecionados.replaceAll(", ;", "");  
                 String sql = "SELECT EXPORTA_XML('" + nomeTabela + "' ,'WHERE " + chave + " IN(" + resIdSelecionados + ")') as XML FROM DUAL";
//                 System.out.println(sql);
                 ResultSet rs = stmt.executeQuery(sql);
                 String nomeDoArquivoComExtensao = exportarDadosPanelEdit.getNomeArquivoIntercambioTextField().getText() + "\\" + nomeTabela + ".xml";
                 exportarDadosPanelEdit.getNomeArquivoIntercambioTextField().setText(getPathOndeSeraSalvoOArquivo());
	   
                 while (rs.next()) {
                     exportarDadosPanelEdit.getNomeArquivoExportandoTextField().setText(nomeTabela);
                   exportarDadosPanelEdit.getJLabel1().setText(nomeTabela);
                     System.out.println("Exportando: " + nomeDoArquivoComExtensao);
                      
                     String xml = rs.getString("XML");
                 
                     if(xml != null){
                          makeFile(nomeDoArquivoComExtensao , xml);
                     }
                 }
         } catch (SQLException e) {
             System.out.println("Não foi possível gerar o arquivo para a tabela " + nomeTabela);
             e.printStackTrace();
         }

Funcionou perfeitamente, enquanto o método exportarParaXmlComWhere(…) é executado está sendo atualizado os valores dos campos textFields, labels, etc. Postei apenas parte do código, para vcs terem uma idéia do que eu es :smiley: :Dtava precisando fazer.

o código:

                 Configurator.configureExportarPanelEdit(ContextExportarDadosPanelEdit.EXPORTAR, exportarDadosPanelEdit, 
                 exportarDadosPanelEdit.getArquivosIntercambioPanel());

chama o contexto (habilita, desabilita, setText, etc) para determinados componentes.

Da mesma forma o código:

                 Configurator.configureExportarPanelEdit(ContextExportarDadosPanelEdit.ABRIR, exportarDadosPanelEdit, 
                 exportarDadosPanelEdit.getArquivosIntercambioPanel());

chama o contexto (habilita, desabilita, setText, etc) para determinados componentes.

Obrigado. :smiley: :smiley: :smiley: :smiley: :smiley: