Dúvida com Thread

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?

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:

[code] 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();[/code]

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

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.