Setar texto no JLabe em Run Time

2 respostas
jayro

Pessoal,

to tentando setar uma mensagem para o usuário no momento que ele dispara um evento no botão. Estou atribuindo uma mensagem em um JLabel e a mesma não atualiza no momento que dou o setText().

private void btnOkMouseClicked(MouseEvent evt) 
	{
		//System.out.println("btnOk.mouseClicked, event="+evt);
		//TODO add your code for btnOk.mouseClicked
		
		try
		{
			
		if(!jtfPath.getText().isEmpty())
		{
			jlbMensagem.setText("Executando a exportação. Aguarde...");
			btnProcurar.enableInputMethods(false);
			ArquivoExel arquivo = new ArquivoExel();
			arquivo.lerXls(jtfPath.getText());
			btnProcurar.enableInputMethods(true);
			this.jlbMensagem.setText("Exportação concluída. Consulte o Log.");
			
		} else
		{
			jlbMensagem.setText("Informe o Backlog.");
			jlbMensagem.setForeground(new Color(255, 0, 0));
		}
		}
		catch(Exception ex)
		{
			jlbMensagem.setText("Erro na exportação. Erro consulte o Log.");
			jlbMensagem.setForeground(new Color(255,0,0));
		}
	}

Alguém tem idéia sobre o que está acontecendo com esse objeto JLabel ?

Grato desde já.

:slight_smile:

2 Respostas

ViniGodoy

A atualização do setText não é instantanea. Quando você dá um setText, ele enfilera um comando na thread do swing, pedindo para o texto do JLabel se atualizar. Entretanto, sua thread está ocupada pelo processamento do botão. Assim, só quando esse processamento terminar, que o Swing irá para a próxima ação da fila, que é a de atualizar o label.

Para resolver esse problema, você precisará rodar todo o código do botão em outra thread.

private void btnOkMouseClicked(MouseEvent evt) {
   if(jtfPath.getText().isEmpty()) {
      jlbMensagem.setText("Informe o Backlog.");
      jlbMensagem.setForeground(new Color(255, 0, 0));
      return;
   }

   new Thread(new Runnable() {
      public void run() {
         try {			
            jlbMensagem.setText("Executando a exportação. Aguarde...");
            btnProcurar.enableInputMethods(false);
            ArquivoExel arquivo = new ArquivoExel();
            arquivo.lerXls(jtfPath.getText());
            btnProcurar.enableInputMethods(true);
            this.jlbMensagem.setText("Exportação concluída. Consulte o Log.");
         } catch(Exception ex) {
            jlbMensagem.setText("Erro na exportação. Erro consulte o Log.");
            jlbMensagem.setForeground(new Color(255,0,0));
         }
      }
   }).start();
}
jayro
ViniGodoy:
A atualização do setText não é instantanea. Quando você dá um setText, ele enfilera um comando na thread do swing, pedindo para o texto do JLabel se atualizar. Entretanto, sua thread está ocupada pelo processamento do botão. Assim, só quando esse processamento terminar, que o Swing irá para a próxima ação da fila, que é a de atualizar o label.

Para resolver esse problema, você precisará rodar todo o código do botão em outra thread.

private void btnOkMouseClicked(MouseEvent evt) {
   if(jtfPath.getText().isEmpty()) {
      jlbMensagem.setText("Informe o Backlog.");
      jlbMensagem.setForeground(new Color(255, 0, 0));
      return;
   }

   new Thread(new Runnable() {
      public void run() {
         try {			
            jlbMensagem.setText("Executando a exportação. Aguarde...");
            btnProcurar.enableInputMethods(false);
            ArquivoExel arquivo = new ArquivoExel();
            arquivo.lerXls(jtfPath.getText());
            btnProcurar.enableInputMethods(true);
            this.jlbMensagem.setText("Exportação concluída. Consulte o Log.");
         } catch(Exception ex) {
            jlbMensagem.setText("Erro na exportação. Erro consulte o Log.");
            jlbMensagem.setForeground(new Color(255,0,0));
         }
      }
   }).start();
}

Vini... cara... ficou blz. Te agradeço pela atenção e ajuda. Felicidades.

:)

Criado 23 de setembro de 2009
Ultima resposta 25 de set. de 2009
Respostas 2
Participantes 2