Captura de eventos em um actionPerformed, jogo de damas [RESOLVIDO]

4 respostas
BeR

Olá camaradas do GUJ.
Estou desenvolvendo um jogo de damas em java, já criei a parte lógica(validação de jogada) do jogo, agora estou desenvolvendo a parte gráfica.
Criei um frame que implementa um actionListener;
Criei uma matriz de botões que será meu tabuleiro, adicionei em um JPanel;
Adicionei as peças(png) no tabuleiro;

Agora o problema é: como devo capturar os eventos de clicks com o mouse para fazer a mudança das peças, lembrando que já tenho a lógica pronta, o que não sei é como lidar com os eventos para tantos botões. MyJToggleButton possui dois atributos a mais(cordenadas int x; int y) e um método setXY. Segue meu código:
public class GUI extends JFrame implements ActionListener{
	JPanel painel;
	MyJToggleButton[][] tabBotao; 
	ImageIcon imgCara = new ImageIcon("imgPecas/cara.png");
	ImageIcon imgCoroa  = new ImageIcon("imgPecas/coroa.png");
	
	
	public GUI(){
		painel = new JPanel();
		tabBotao = new MyJToggleButton[8][8];
		
		painel.setLayout(null);
		int x=3;
		int y=3;
		int c=0;
		int l=0;
		boolean tf = false;
		
        //criacao do tabuleiro
		while(c<8){
			while(l<8){
				tabBotao[l][c] = new MyJToggleButton();
				tabBotao[l][c].setBounds(x, y, 70, 70);
				tabBotao[l][c].addActionListener(this);
				if(tf == true){
					tabBotao[l][c].setBackground(Color.lightGray);
					tf= false; 
				}else{
					tabBotao[l][c].setBackground(Color.white);
					tf= true;
				}
				painel.add(tabBotao[l][c]);
				y+=70;
				l++;
			}
			c++;   l=0;
			x+=70; y=3;
			if(tf == true) tf= false; 
			else           tf= true;	
		}		
		
		
        //adicionando as pecas ao tabuleiro
		l = 0; // linha
		c = 1; // coluna
		while (l <= 2) {
			while (c <= 7) {
				tabBotao[l][c].setIcon(imgCara);
				c += 2;
			}
			l += 1;
			if (c % 2 == 0)// se c = par, c recebe 1;
				c = 1;
			else
				// senao, c recebe 0;
				c = 0;
		}

		l = 5; // linha
		c = 0; // coluna
		while (l <= 7) {
			while (c <= 7) {
				tabBotao[l][c].setIcon(imgCoroa);
				c += 2;
			}
			l += 1;
			if (c % 2 == 0)// se c = par, c recebe 1;
				c = 1;
			else
				// senao, c recebe 0;
				c = 0;
		}		
		

		//configuracoes da janela
		this.pack();
		this.getContentPane().add(painel);
		this.setTitle("Jogo de Damas");
		this.setResizable(false); // impede que a janela seja redimensionael
		this.setSize(572, 594);
		Dimension tamanhoTela = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((tamanhoTela.width - this.getWidth()) / 2,
				(tamanhoTela.height - this.getHeight()) / 2);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setVisible(true);
	}

	
	public void actionPerformed(ActionEvent e) {
		//como lidar com os eventos para mudança de posição das peças		
	}
}

4 Respostas

drsmachado

Deve ter um jeito melhor, mas eu criaria uma variável para pegar o nome do botão (coordenada) e, ao clicar num determinado, capturaria esse nome e chamaria um método específico para mover. Então, verificaria qual o nome clicado e moveria a peça.

BeR

Ola drsmachado.
cada peça(JTogleButton) possui atributos de cordenadas x,y eu gostaria de ao clicar na peça algo pegasse essas cordenadas para que eu possa envia-las para a parte lógica do meu programa que é responsável por validar os movimentos, mas eu não sei como eu posso gerenciar tantos botões.
A minha ideia é fazer com que essa classe mova apenas visualmente as peças, mas não sei por onde começar.

drsmachado

Então, cada botão tendo um nome, você consegue verificar este referencial.

BeR

Obrigado drsmachado pela força.
Resolvi meu problema adicionando esse trecho de código no actionPerformed

MyJToggleButton evt = (MyJToggleButton)e.getSource(); // ???casting
		
//se nenhuma peca foi clicada anteriormente, guarde a primeira 
if(!tf){
	estou.x = evt.x;
	estou.y = evt.y;
	tf = true;
}
else{ //ja temos as duas cordenadas entao vamos fazer o movimento
	tabBotao[evt.x][evt.y].setIcon(tabBotao[estou.x][estou.y].getIcon());//
	tabBotao[estou.x][estou.y].setIcon(null);
	tabBotao[evt.x][evt.y].setSelected(false);
	tabBotao[estou.x][estou.y].setSelected(false);
	tf = false;
}
Criado 5 de junho de 2011
Ultima resposta 8 de jun. de 2011
Respostas 4
Participantes 2