Referenciar variável não-final dentro de uma innerclass (impossível sim. Alternativas, quais?)

2 respostas
M

Segue abaixo o código de um metodo que cria os botões pro meu jogo de xadrez.
Ele cria cada botão e dá o valor da casa que ele representa no xadrez (1,0 / 1,1… etc).
Porém não consigo fazer uma maneira de esta InnerClass armazenar APENAS o valor iteral daquele momento da variável.

private void geraBotoes() {
		Peca[][] tabuleiro = xadrez.getTabuleiro();
		for (int coluna = 0; coluna < tabuleiro.length - 1; coluna++) {
			for (int linha = 0; linha < tabuleiro.length - 1; linha++) {
				if (tabuleiro[linha][coluna] != null) {
					arrayBotoes.add(new JButton(new ImageIcon(tabuleiro[linha][coluna].toString())));
				} else {
					arrayBotoes.add(new JButton());
				}
				arrayBotoes.get(arrayBotoes.size()).addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent arg0) {
						xadrez.controlaPeca(coluna, linha);
					}
				});
			}
		}
	}

Então… quero que cada botão retorne um valor próprio, no caso a “posição” que ele representa.
Eu não gostaria de criar 64 ActionListeners afim de dar todas as posições possíveis num jogo de Xadrez.
Queria fazer isso com um “simples” For()…

Alternativas? Quais?

2 Respostas

Markus_Alemao

ai vai minha "alternativa" hehehe

Voce quer que o botao retorne a posicao que ele representa....
import java.util.HashMap;
import javax.swing.Icon;
import javax.swing.JButton;

public class Botao extends JButton
{
    private HashMap<String,Integer> mapPosicao;
    
    public Botao(Icon icon, int coluna, int linha)
    {
        super(icon);
        this.addActionListener(new EventoBotao());
        this.mapPosicao = new HashMap<String, Integer>();       
        this.mapPosicao.put("coluna", coluna);
        this.mapPosicao.put("linha", linha);
    }
    public HashMap getPosicaoBotao()
    {
        return this.mapPosicao;
    }
}
quanto aos ActionListeners fiz dessa forma.....
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EventoBotao implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        ((Botao)e.getSource()).getPosicaoBotao();
    }
}

eu faria dessa forma ....nao sei se é realmente o que voce queria mas ai esta ...

M

Infelizmente ja tentei isso.

O problema é que o botão tem que executar um método da minha UpperClass com 2 inteiros prédefinidos.
Eu preciso gerar estes inteiros na hora da criação do botao.

Mas a partir do momento que eu ponho um FOR pra gerar os botoes automaticamente isso aqui acontece:

public class BotaoModel extends JButton {
		public BotaoModel(Icon icon, int coluna, int linha) {
			super(icon);
			this.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					xadrez.controlaPeca(linha, coluna);  // AQUI ACONTECE O PROBLEMA COM O FINAL
				}
			});
		}
       }


       for (int linha = 0; linha < tabuleiro.length; linha++) {
                 for (int coluna = 0; coluna < tabuleiro.length; coluna++) {
                        new BotaoModel botao = new BotaoModel(linha, coluna);  // E AQUI TAMBÉM
       }

@Markus Alemao
Mesmo assim MUITO obrigado por ajudar, fico no aguardo ai se surgir uma luz. Um abraço.

Criado 27 de agosto de 2010
Ultima resposta 28 de ago. de 2010
Respostas 2
Participantes 2