Intervalo de tempo

9 respostas
rodolfo_b_g

eu tenho uma jtable onde o usuário determina o inicio e o fim ai um robo chamado "R" caminha do inicio para o fim selecionando um caminho aleatório até chegar o fim e termina no jogo, toda vez q ele passa por uma célula ele pinta ela de vermelha tornando o vermelho mais escuro conforme vai passando pela cécula mais de uma vez ....isso controlado por uma matriz.... a questão eh quando o código eh executado eu queria que ele mostrasse passo a passo o robo andando pq do jeito q está ele vai de uma vez..... segue o código do botão que inicia a movimentação do robô..

private void iniciarActionPerformed(java.awt.event.ActionEvent evt) {                                        
        
// TODO adicione seu ¿½digo de manipula��o aqui:

         int celulas[][] = null,i=0,j=0,regra_invalida=0;
         
         celulas= new int[10][10];
         for(i=0;i&lt10;i++){
             for(j=0;j&lt10;j++){
                 celulas[i][j]=0;       ///zera a tabela das celulas
             }
         }        
       pintar renderer = new pintar();
       tabela.setDefaultRenderer(Object.class, renderer); //  &lt======== define o renderer   

        int regra=0;
        if(estado==3){
                        iniciar.setEnabled(false);
                        while((linha_inicial!=linha_final)||(coluna_inicial!=coluna_final)){
                            regra=1+(int)(Math.random()*8);                           
                            tabela.setValueAt("",linha_inicial,coluna_inicial);
                            
                            switch(regra){
                                case 1:
                                        if((linha_inicial&gt0)&&(coluna_inicial&gt0)){
                                            linha_inicial--;
                                            coluna_inicial--;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 2:
                                        if(linha_inicial&gt0)
                                        {
                                            linha_inicial--;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 3:
                                        if((linha_inicial&gt0)&&(coluna_inicial&lt9)){
                                            linha_inicial--;
                                            coluna_inicial++;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 4:
                                        if(coluna_inicial&lt9){
                                            coluna_inicial++;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 5:
                                        if((linha_inicial&lt9)&&(coluna_inicial&lt9)){
                                            linha_inicial++;
                                            coluna_inicial++;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 6:
                                        if(linha_inicial&lt9){
                                            linha_inicial++;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 7:
                                        if((linha_inicial&lt9)&&(coluna_inicial&gt0)){
                                            linha_inicial++;
                                            coluna_inicial--;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                case 8:
                                        if(coluna_inicial&gt0){
                                            coluna_inicial--;
                                        }
                                        else
                                            regra_invalida=1;
                                        break;
                                default:
                                      break;
                            }
                            if(regra_invalida==0)//se regra_invalida for 0 sera feita a movimentaçao se nao nao sera feito nada
                            {                         
                                           
                                         
                                           tabela.setValueAt("R",linha_inicial,coluna_inicial);
                                           celulas[linha_inicial][coluna_inicial]=celulas[linha_inicial][coluna_inicial] + 2 ;
                                           f =(float)celulas[linha_inicial][coluna_inicial];
                                           f = f*Float.parseFloat("0.02");
                                           f = 1 - f;                                                                                   
                                           [b]renderer.colorirCelula(linha_inicial,coluna_inicial, Color.getHSBColor(1,1,f)); =====&gtpinta a célula[/b]
                                           movimentos++;
                            }
                            else
                                regra_invalida=0;
                        }
                        tabela.setValueAt("INICIO",linha_I,coluna_I);
                        if(linha_inicial==linha_final&&coluna_inicial==coluna_final)
                            JOptionPane.showMessageDialog(null,"Jogo Terminado! Foram feitos "+movimentos+" movimentos.");
                        else
                            JOptionPane.showMessageDialog(null,"Ta não terminado!");
                        JOptionPane.showMessageDialog(null,"inicio:"+linha_I+","+coluna_I+".");
                        JOptionPane.showMessageDialog(null,"fim:"+linha_final+","+coluna_final+".");
                        estado=4;

9 Respostas

rodolfo_b_g

soh pra ressaltar eu pesquisei sobre threads e sobre o timer…mais não achei nada que resolvesse isso…

Marky.Vasconcelos

Cara eu aconselho você parar de usar esse Switch e usar o polimorfismo com enums

tipo nesse tópico
http://www.guj.com.br/posts/list/55885.java
Com o post do VinyGodoy

E o Thread.sleep(int time); ou o Timer to Swing não resolveu seu problema com tempo?

rodolfo_b_g

muito bom esse ex de naum usar switch… então eu coloquei o thread.sleep(200) por exemplo…depois de pintar a célula, só que ele não pinta ,“dorme” o intervalo e depois pinta de novo, ele acumula todos os sleep durante o processo… tipo vamos supor q colocasse 1 seg de sleep …se ele executar 30seg ele trava a tabela e depois de 30seg mostra o resultado todo de uma vez…e eu naum quero isso quero que mostre passo a passo o robo andando…

Marky.Vasconcelos

Mas aonde você ta colocando o sleep()?

rodolfo_b_g
if(regra_invalida==0)//se regra_invalida for 0 sera feita a movimentaçao se nao nao sera feito nada
                            {                         
                                           
                                         
                                           tabela.setValueAt("R",linha_inicial,coluna_inicial);
                                           celulas[linha_inicial][coluna_inicial]=celulas[linha_inicial][coluna_inicial] + 2 ;
                                           f =(float)celulas[linha_inicial][coluna_inicial];
                                           f = f*Float.parseFloat("0.02");
                                           f = 1 - f;                                                                                   
                                           renderer.colorirCelula(linha_inicial,coluna_inicial, Color.getHSBColor(1,1,f)); =====&gtpinta a célula

                                           try { 
                                                     Thread.sleep (1000); 
                                              } catch (InterruptedException ex) {}


                                           movimentos++;
                            }
                            else
                                regra_invalida=0;
                        }

onde pinta a célula .....entre o renderer e o movimentos++;

sergiotaborda

O seu problema é que vc está usando um render para conter logica de dados
Use um TableModel para controlar o modelo de quantas vezes o robot passou na celula. Use um timer para atualizar esse modelo de x em x segundos. Quando o modelo mudar, dispare um evento para a tabela (procure por AbstractTableModel). Isso fará a tabela se re-pintar.
Use o rendrizador apenas para traduzir o numero de passagens em cores.

rodolfo_b_g

e se eu tirasse o while e colocasse isso em um método e usar um timer para chamar esse método de x em x segundos, será que não resolveria? e se fosse teria como alguem me ajudar com um exemplo de timer que chama um método de x em x segundos??

sergiotaborda
Timer timer = new Timer();

class MyTimerTask extends TimerTask {

   public void run(){
         // aqui vai o codigo que se repete a cada x segundos
   }
}

timer.scheduleAtFixedRate(new MyTimerTask(),0,x*1000); // x em segundos
rodolfo_b_g

ufaaa até que enfim deu certo....vlw pela ajuda galera....eu fiz assim como falei....tirei o while e coloquei o código em um método movimentar(), dai criei o timer como vc me passou sergio...soh q um pocuo modificado

int delay = 500;   // delay de 0.5 seg.
         int interval = 1000;  // intervalo de 1 seg.                 
         timer.scheduleAtFixedRate(new TimerTask() {
             public void run() {
                 int resp;
                      resp=movimentar();
                      if(resp==1){
                          timer.cancel();
                      }                  
                      
             }
         }, delay, interval);

ai quando o robo chega no fim o metodo retorna 1 o timer eh cancelado...tava tendo um pouco de dificuldade pois essa função timer eh da util.Timer e não da swing.Timer como eu estava tentando fazer.... abraços t+

Criado 1 de setembro de 2007
Ultima resposta 3 de set. de 2007
Respostas 9
Participantes 3