JTextField

7 respostas
Camylle

Olá a todos
Eu estou com um problma de atualização de JTextField. Eu preciso que o valor de JTextField atualiza a cada iteração “do while”, mas ele não está atualizando. só atualiza todos juntos para zero. Fiz assim:

try
{

do{

reserva=v[c];

valorReal=reserva-decrementa;

Thread.sleep(2000);

if(valorReal<0)

{

v[c]=0;

text[c].setText(" "+0);
}

else{

v[c]=valorReal;

text[c].setText(" "+valorReal);

}

}while(valorReal>0);

reserva=0;

}

catch (Exception e)

{

JOptionPane.showMessageDialog(null, “Erro! Reinicie o software!”);

}

Alguem tem ideia do que pode estar errado ou o que eu estou fazendo errado?

7 Respostas

pimenta

A cada iteração reconstrua o JFrame/JPanel que o JTextField está…
Deve funcionar…

ViniGodoy

pimenta:
A cada iteração reconstrua o JFrame/JPanel que o JTextField está…
Deve funcionar…

Não, isso também não funciona. :frowning:

Atualizar campos assim é mais difícil do que parece. O que acontece é que seu while roda na thread do Swing. Então, enquanto você atualiza os valores, não importa que comando você dê, o swing não irá repintar a tela. Se você der um comando para que ele repinte, esse comando também vai esperar até que você termine seu loop.

Você teria que disparar esse método em outra thread. Esse é um exemplo de como fazer isso:

Thread t = new Thread(new Runnable() {
   public void setText(final JTextField txtField, final String text) {
      EventQueue.invokeLater(new Runnable() {
         public void run() {
            txtField.setText(text);
         }
      });
   }     
     
   public void run() {
      try {
         do{
            reserva=v[c];
            valorReal=reserva-decrementa;
            Thread.sleep(2000);
            if(valorReal<0) {
               v[c]=0;
               setText(text[c], " "+0);
            }
            else{
               v[c]=valorReal;
               setText(text[c], " "+valorReal);
            }
         }while(valorReal>0);
         reserva=0;
      }
      catch (Exception e) {
         JOptionPane.showMessageDialog(null, "Erro! Reinicie o software!");
      } 
   }
}
).start();

Note que eu criei um método chamado setText. Isso porque, quando você está usando outra thread, não deve atualizar os componentes gráficos do Swing diretamente. É necessário usar a fila de eventos e pedir para que a thread do Swing faça isso. É para isso que serve o EventQueue.invokeLater. Ele “agenda” o Runnable para ser executado pela thread do Swing.

Outra coisa, sempre que postar código, use a tag code. Assim seu código fica formatado, como o meu ali em cima. :slight_smile:
Se você não sabe fazer isso, lê esse post aqui:
http://www.guj.com.br/posts/list/50115.java

Ele te ensina a usar esse e outros recursos do fórum. :wink:

pimenta

Foi bom até pra mim isso. Não sabia dessa…
E realmente faz muito sentido.

Abraços,

Camylle

Tudo bem. e para fazer isso dentro de um outro metodo.

public void escolherProcessoEscalonamento(int v[],JTextField text[],int tamanho)
      {
for(int c=0;c<tamanho;c++)
         {
         
            try
            {
                              
              do{
                                   reserva=v[c];
                  valorReal=reserva-decrementa;
                  Thread.sleep(2000);
                  if(valorReal<0)
                  {
                     v[c]=0;
		               text[c].setText("    "+0);
                                                    
                  }
						else{
					      v[c]=valorReal;
							text[c].setText("    "+valorReal);
							
							}
												   
                     
              }while(valorReal>0);
            
               reserva=0;
            	
            }
            
                catch (Exception e)
               {
                  JOptionPane.showMessageDialog(null, "Erro! Reinicie o software!");
               
               }
         
         
         }
       }

preciso desses metodos dentro o "for" da linha 3. Se pudessem me ajudar eu agradeceria. Estou com muita dificuldade com isso.

ATT

ViniGodoy

Fica quase igual:

public void escolherProcessoEscalonamento(int v[],JTextField text[],int tamanho) {   
   Thread t = new Thread(new Runnable() {   
      public void setText(final JTextField txtField, final String text) {   
         EventQueue.invokeLater(new Runnable() {   
            public void run() {   
               txtField.setText(text);   
            }   
         });   
      }       
          
      public void run() {   
         for(int c=0;c&lt;tamanho;c++) {   
            try {   
               do{   
                  reserva=v[c];   
                  valorReal=reserva-decrementa;   
                  Thread.sleep(2000);   
                  if(valorReal&gt;&lt;0) {   
                     v[c]=0;   
                     setText(text[c], &quot; &quot;+0);   
                  }   
                  else{
                     v[c]=valorReal;
                     setText(text[c], &quot; &quot;+valorReal);
                  }
               }while(valorReal&gt;0);
               reserva=0;
            }
            catch (Exception e) {
               JOptionPane.showMessageDialog(null, &quot;Erro! Reinicie o software!&quot;);
            }
         }
      }
   }).start(); 
}
Camylle

Olá…
Muito obrigada pelas dicas…
Conversei com alguns colegas de faculdade e descobri se eu der o comando

if(valorReal<0) { v[c]=0; text[c].setText(" "+0); this.update(this.getGraphics()); } else{ v[c]=valorReal; text[c].setText(" "+valorReal); this.update(this.getGraphics()); }

deu certo também…
Att

ViniGodoy

Isso também dá certo, mas nem sempre. E também tem péssima performance.

Mas ok, se já serve para o seu trabalho, tudo bem. Só lembre-se de que existe aquele jeito que eu mostrei, que é a maneira recomendada de se fazer. :wink:

Criado 18 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 7
Participantes 3