Travar JButton

4 respostas
D

Estou desenvolvendo um jogo da memória e preciso que ele mostre a imagem ao clicar num JButton, depois, ao clicar em outro JButton, mostre a imagem e verifique se as imagens são iguais. Se não forem mude para a imagem default. Só que ele mostra a primeira imagem e ao clicar em outro JButton ele, mostra muito rápido ou nem mostra, faz o teste e se não forem iguais ele muda para a imagem default.

Tentei usar:

try {  
    Thread.sleep(1000);  
} catch (Exception e) {  
   e.printStackTrace();  
}

só que não ta funcionando, ele dá um delay mas continua com o mesmo problema. Gostaria também de saber se existe algum comando que trave o JButton para eu não poder mais clicar nele.

4 Respostas

S

OLHA PARA FAZERES O QUE ESTAS QUERENDO FAZER APENAS DEVES USAR OS EVENTOS CERTOS,
EM JAVA TEM MUITOS EVENTOS QUE PODEMOS UTILIZAR MUITOS MESMO QUE ATÉ NEM IMAGINAMOS O PODER QUE OS EVENTOS
PODEM NOS DAR.
OLHA VOU DAR UMA EXPLICADA DE ALGUNS EVENTOS PARA TE DAR UMAS IDEAS.
FAZ O SEGUINTE INVES DE USAR OS THREAD PODES USAR OS EVENTOS QUE AXO QUE VAI FICAR MAIS FACIL.
QUANDO SE CLICLAR NO SEGUNDO BOTAO NO EVENTO CLICLICK POE AS TUAS CONDICOES E FAZ O QUE TEM QUE FAZER
AGORA QUANDO O MOUSE ESTIVER A SAIR DO BOTAO( LOST FOCUS, MOUSE MOVE EXIT, OU ALGO PARECIDO) AI É NESTE MOMENTO QUE ELE DEVE MUDAR PARA A IMAGEM DEFAULT. ESTUDA MAIS OS EVENTOS E VERAS QUE MESMO SEM USAR OS THREAD PODERAS FAZER ISTO QUE
QUERES.
ABRAÇO :slight_smile: :idea:

P

Dentro da classe onde você controla a troca das imagens crie uma classe interna que será uma Thread com o nome ex. (Contador).
No evento onde você direicionou o eventos de clique de todos os botões (opções) que provavelmente deverá fazer a comparação se a primeira imagem é igual a segunda imagem, caso não forem iguais, vc roda essa Thread. Basicamente seria mais ou menos isso:

private eventoBotoes implements ActionListener {
    public void actionPerformed(ActionEvent ev) {
        mostraImagem(evt.getSource());
        if(imagem1.equals(imagem2)
            System.out.println("ACERTOU");
        else {
             System.out.println("ERROU");
             new Contador().start();
         }
    }
}

class Contador extends Thread {
    public void run() {
          Thread.sleep(2000); // 2 segundos
          resetaImagens();
    }
}

Essa é uma das abordagens. Qualquer dúvida, só perguntar.
Abraço

D

Eu fiz o tratador de eventos dessa forma:

private class TratarEventos implements ActionListener {
		int jogada;
		int but1, but2;
		public void actionPerformed (ActionEvent evento) {
			for (int i = 0; i < botao.length; i++) {
				if (evento.getSource() == botao[i]) {
					botao[i].setIcon(icones[i]);
					jogada += 1;
					if (but1 ==-1) but1 = i;
					else but2 = i;
					//JOptionPane.showMessageDialog(null, "Jogada: " + jogada, 
						//"Jogada", JOptionPane.INFORMATION_MESSAGE);
				}
			}
			if (jogada == 2)
				if (botao[but1].getIcon() != botao[but2].getIcon()) {
					botao[but1].setIcon(padrao);
					botao[but2].setIcon(padrao);
					but1 = -1;
					but2 = -1;
					jogada = 0;
				}
				else {
					but1 = -1;
					but2 = -1;
					jogada = 0;
				}
		}
	}

Dessa forma, ele joga os valores dos botões para variaveis e incrementa o contador. Ele verifica as imagens após o segundo click. Só que a segunda imagem aparece muito rápido e não dá pra ver. Outra coisa que gostaria de saber é se existe algum metodo que trave o botão, que ele não seja mais clicado.

D

Resolvi o problema do travamento dos botões.
usei:

botao[0].setEnable(false);
ele deixa a imagem cinza, não fica muito legal mas pelomenos trava

Criado 23 de novembro de 2009
Ultima resposta 24 de nov. de 2009
Respostas 4
Participantes 3