Dúvida com Thread

2 respostas
ericsobral

Olá pessoal, estou com uma dúvida com Thread + Sleep.

Criei uma classe Botao que Extends JButton que tem o seguinte método:

public void piscaBotao(final Botao botao){
  botao.setIcon(new ImageIcon(imagens+botao.getNome()+"_aceso.jpg"));
  botao.setRolloverIcon(new ImageIcon(imagens+botao.getNome()+"_aceso.jpg"));
  new Thread(new Runnable(){
    public void run(){
      try{
        Thread.sleep(800);
      }catch (Exception e){}
      EventQueue.invokeLater(new Runnable(){
        public void run(){
          botao.setIcon(new ImageIcon(imagens+botao.getNome()+"_apagado.jpg"));
          botao.setRolloverIcon(new ImageIcon(imagens+botao.getNome()+"_marcado.jpg"));
        }
      });
    }
  }).start();
}

E na classe que monta a tela de jogo tenho os métodos:

public void setStatusBotoes(Boolean status){
  azul.setStatus(status);
  amarelo.setStatus(status);
  verde.setStatus(status);
  vermelho.setStatus(status);
  laranja.setStatus(status);
  violeta.setStatus(status);
}

e quando eu clico no botão laranja por exemplo:

...

laranja.addActionListener(
  new ActionListener(){
    public void actionPerformed(ActionEvent e){
      if (laranja.getStatus()){
        setStatusBotoes(false);
        laranja.piscaBotao(laranja);
        setStatusBotoes(true);
      }
    }
  }
);

...

O problema é ele não está fazendo o Sleep.

Antes eu tinha colocado o método piscaBotao dentro de quando ele clicasse no laranja (nesse caso o Sleep funciona perfeito), porém algumas vezes eu preciso piscar o botão sem clicar nele…

Alguém poderia me ajudar?

2 Respostas

ViniGodoy

O rollover icon responde ao evento do mouse, não a sua thread.

A solução é colocar um loop na sua thread, que dê um setIcon no botão, alternando entre o estado apagado e aceso. Algo mais ou menos assim:

new Thread(new Runnable() {
            private void setIcon(final String name) {
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        botao.setIcon(new ImageIcon(imagens + botao.getName()
                                + name));
                    }
                });
            }

            public void run() {
                try {
                    while (!Thread.interrupted()) {
                        setIcon("_aceso.jpg");
                        Thread.sleep(5000);
                        setIcon("_apagado.jpg");
                    }
                } catch (InterruptedException e) {}
            }
        }).start();

PS: Que jogo você está fazendo? É trabalho de faculdade?

ericsobral

Estou fazendo o Genius. Sim trabalho de faculdade.

Só que o professor só ensinou java básico, falou pra pesquisar e fazer o trabalho. Então não entendo muito de java ainda…

Vou testar essa sua dica.

Criado 19 de junho de 2007
Ultima resposta 19 de jun. de 2007
Respostas 2
Participantes 2