Problema com addActionListener()

8 respostas
J

Bom dia senhores,
Estou implementando um jogo de Trilha (Descrição do jogo no wikipedia)

Porem encontrei um impasse, tenho uma classe Peca que extends de JButton assim como uma classe Tabuleiro que extends de JLayeredPane (para que pudesse colocar vários botões emcima, foi a solução que encontrei).
Adiciono a classe Tabuleiro várias posições (as casas do tabuleiro), sendo que cada posição contém uma peça vazia (tenho três estados da peça, vazia, preta e branca).
Até ai tudo bem, porém quando tento adicionar addActionListener() para todos os botões (todas as posiçoes do tabuleiro deveriam esperar passivamente as ações do usuario), somente meu ultimo botão adicionado ao Tabuleiro recebe o action listener.
Segue partes do código:

//isto está na minha classe JogoPrincipal que cria a parte gráfica, instancio-a na main
tab.posicoes[0][0].getPeca().addActionListener(this);
tab.posicoes[0][3].getPeca().addActionListener(this);
tab.posicoes[0][6].getPeca().addActionListener(this);
tab.posicoes[1][1].getPeca().addActionListener(this);
//estes são apenas algumas posições, tem mais várias, mas testando só com essas já encontro problemas

painel.add(tab, javax.swing.JLayeredPane.DEFAULT_LAYER);
//adiciono o Tabuleiro (tab) dentro do painel principal da aplicação gráfica

Apenas o ultimo botão que adicionei ao Tabuleiro(dentro de seu construtor) recebe o action listener, e ele interpreta como sendo o primeiro ([0][0]) quando clico no botão, sendo que é o último ([6][6]).
Já estou quebrando a cabeça há algum tempo aqui, se tiver alguma forma mais simples de faze-lo, agradeço dicas e opniões…

8 Respostas

D

Olá, a LayeredPane é usando para se sobrepor componentes, é isso mesmo que você quer?
Acredito que nesse jogo não há necessidade de se usar o JLayeredPane.

Poste o classe Tabuleiro para vermos.

J

Opa, então, fiz com JLayeredPane porque precisava colocar vários botões emcima e com um panel normal não deu muito certo, segue o código do Tabuleiro:

package TrilhaPackage;

import java.awt.*;
import javax.swing.*;

public class Tabuleiro extends JLayeredPane{

    static Posicao posicoes[][];

    public Tabuleiro() {
        posicoes = new Posicao[7][7];
        this.setBorder(new FundoSistema());
		this.setBounds(10, 10, 380, 380);

		//laço para criar todas as posições
        for (int i = 0; i <= 6; i++) {
            for (int j = 0; j <= 6; j++) {
                if (i == 0 || i == 6) {
                    if (j == 0 || j == 3 || j == 6) {
                        posicoes[i][j] = new Posicao(i + "x" + j);
                    }
                }
                if (i == 1 || i == 5) {
                    if (j == 1 || j == 3 || j == 5) {
                        posicoes[i][j] = new Posicao(i + "x" + j);
                    }
                }
                if (i == 2 || i == 4) {
                    if (j >= 2 && j <= 4) {
                        posicoes[i][j] = new Posicao(i + "x" + j);
                    }
                }
                if (i == 3) {
                    if (j != 3) {
                        posicoes[i][j] = new Posicao(i + "x" + j);
                    }
                }
            }
        }

        //colocar as (botões)peças vazias no tabuleiro
        //posição 0x0
        this.getPosicao(0, 0).criaPeca(0);
    	posicoes[0][0].getPeca().setBounds(3, 3, 30, 30);
		this.add(posicoes[0][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 0x3
		this.getPosicao(0, 3).criaPeca(0);
    	posicoes[0][3].getPeca().setBounds(175, 3, 30, 30);
		this.add(posicoes[0][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 0x6
		this.getPosicao(0, 6).criaPeca(0);
    	posicoes[0][6].getPeca().setBounds(347, 3, 30, 30);
		this.add(posicoes[0][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 1x1
		this.getPosicao(1, 1).criaPeca(0);
    	posicoes[1][1].getPeca().setBounds(60, 60, 30, 30);
		this.add(posicoes[1][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 1x3
		this.getPosicao(1, 3).criaPeca(0);
    	posicoes[1][3].getPeca().setBounds(175, 60, 30, 30);
		this.add(posicoes[1][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 1x5
		this.getPosicao(1, 5).criaPeca(0);
    	posicoes[1][5].getPeca().setBounds(290, 60, 30, 30);
		this.add(posicoes[1][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 2x2
		this.getPosicao(2, 2).criaPeca(0);
    	posicoes[2][2].getPeca().setBounds(118, 117, 30, 30);
		this.add(posicoes[2][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 2x3
		this.getPosicao(2, 3).criaPeca(0);
    	posicoes[2][3].getPeca().setBounds(175, 117, 30, 30);
		this.add(posicoes[2][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 2x4
		this.getPosicao(2, 4).criaPeca(0);
    	posicoes[2][4].getPeca().setBounds(232, 117, 30, 30);
		this.add(posicoes[2][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x0
		this.getPosicao(3, 0).criaPeca(0);
    	posicoes[3][0].getPeca().setBounds(60, 175, 30, 30);
		this.add(posicoes[3][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x1
		this.getPosicao(3, 1).criaPeca(0);
    	posicoes[3][1].getPeca().setBounds(3, 175, 30, 30);
		this.add(posicoes[3][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x2
		this.getPosicao(3, 2).criaPeca(0);
    	posicoes[3][2].getPeca().setBounds(118, 175, 30, 30);
		this.add(posicoes[3][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x4
		this.getPosicao(3, 4).criaPeca(0);
    	posicoes[3][4].getPeca().setBounds(232, 175, 30, 30);
		this.add(posicoes[3][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x5
		this.getPosicao(3, 5).criaPeca(0);
    	posicoes[3][5].getPeca().setBounds(290, 175, 30, 30);
		this.add(posicoes[3][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 3x6
		this.getPosicao(3, 6).criaPeca(0);
    	posicoes[3][6].getPeca().setBounds(347, 175, 30, 30);
		this.add(posicoes[3][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 4x2
		this.getPosicao(4, 2).criaPeca(0);
    	posicoes[4][2].getPeca().setBounds(118, 233, 30, 30);
		this.add(posicoes[4][2].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 4x3
		this.getPosicao(4, 3).criaPeca(0);
    	posicoes[4][3].getPeca().setBounds(175, 233, 30, 30);
		this.add(posicoes[4][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 4x4
		this.getPosicao(4, 4).criaPeca(0);
    	posicoes[4][4].getPeca().setBounds(232, 233, 30, 30);
		this.add(posicoes[4][4].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 5x1
		this.getPosicao(5, 1).criaPeca(0);
    	posicoes[5][1].getPeca().setBounds(60, 290, 30, 30);
		this.add(posicoes[5][1].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 5x3
		this.getPosicao(5, 3).criaPeca(0);
    	posicoes[5][3].getPeca().setBounds(175, 290, 30, 30);
		this.add(posicoes[5][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 5x5
		this.getPosicao(5, 5).criaPeca(0);
    	posicoes[5][5].getPeca().setBounds(290, 290, 30, 30);
		this.add(posicoes[5][5].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 6x0
        this.getPosicao(6, 0).criaPeca(0);
    	posicoes[6][0].getPeca().setBounds(3, 348, 30, 30);
		this.add(posicoes[6][0].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 6x3
		this.getPosicao(6, 3).criaPeca(0);
    	posicoes[6][3].getPeca().setBounds(175, 348, 30, 30);
		this.add(posicoes[6][3].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);

		//posição 6x6
		this.getPosicao(6, 6).criaPeca(0);
    	posicoes[6][6].getPeca().setBounds(347, 348, 30, 30);
		this.add(posicoes[6][6].getPeca(), javax.swing.JLayeredPane.DEFAULT_LAYER);


    }

    protected Posicao getPosicao(int lin, int col) {
        return posicoes[lin][col];
    }

}
D

a sua Classe Posicao possui o que? É nela que está instanciando o JButton?

J

A classe Posicao possui um id e um objeto da classe Peca.
A classe Posicao são as casas no tabuleiro, e dai instancio uma peça em cada posiçao, inicialmente esta peça esta vazia, e conforme o jogo acontece a peça muda de estado para branca ou preta.

D

Poste o código então da classe Posição =]

Acredito que o erro esteja ai… :stuck_out_tongue:

J
package TrilhaPackage;

class Posicao{
	static Peca peca;
	private String id;

    protected String getId(){
        return this.id;
    }

	protected Posicao(String id){
		this.id = id;
	}

	protected void setPeca(Peca peca){
		this.peca = peca;
	}

	protected void criaPeca(int cor){
		this.peca = new Peca(cor);
	}

	protected Peca getPeca(){
		return this.peca;
	}
}

Meu programa esta impacado porr causa desse erro, e não consigo continuar :cry:

D

Bom… to vendo que você esta usando muitos atributos estáticos… Bom poste a classe Peca e vamos alterar esse código.

J

Opa Diego,
Felizmente consegui continuar meu trabalho.
Um amigo conhece programadores java pediu para eles darem uma olhada. Eis que encontraram o que me tirava o sono, fizeram o adicionamento dos listeners dentro de um método na classe tabuleiro, e este método é chamado dentro da minha classe principal, por incrivel que pareça deu certo.
Outra coisa que aprendi: atributos estáticos são perigosos, tive de tirar praticamente todos, e comecei a ver que o meu código se comportava mais da maneira como deveria…

Enfim, estou agora somente com muito código para desenvolver, porém não estou mais com problemas estranhos, então só me falta tempo…rsrs

Obrigado por gastar teu tempo aqui, vlw pela ajuda :smiley:

Criado 25 de novembro de 2011
Ultima resposta 27 de nov. de 2011
Respostas 8
Participantes 2