按钮数组的addActionListener?

时间:2013-06-15 19:17:53

标签: java

你好我正在尝试做一个国际象棋比赛,但只有骑士。

import javax.swing.JButton;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.Icon;
import javax.swing.ImageIcon;

public class Knight {
    private Icon image;
    private int w;
    private int k;
    private Random rand;

    public Knight() {
        image = new ImageIcon(getClass().getResource("redKnight.gif"));
        w = rand.nextInt(9);
        k = rand.nextInt(9);
    }

    public void Caballo(JButton[][] matriz, int i, int j) {
        matriz[i][j].setIcon(image);

        matriz[i][j].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //Execute when button is pressed
                matriz[i][j].setBackground(Color.RED);
            }
        });
    }
}

所以我试图做一个递归方法,我不太确定会工作。 但问题是在addActionListener内部,netbeans告诉我变量必须是最终的,我不知道为什么。一旦我运行它,图像根本不显示

以下是代码的其余部分

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.*;
import javax.swing.JPanel;
import java.util.Random;

public class Tablero {
    private JButton[][] mesa;
    private Random rad;
    public Tablero() {
        mesa = new JButton[8][8];
    }

    public void cuadriculado(JFrame ventana) {
        JPanel panel = new JPanel(new GridLayout(8, 8, 0, 0));

        for (int i = 0; i < mesa.length; i++) {
            for (int j = 0; j < mesa[0].length; j++) {
                mesa[i][j] = new JButton();
                mesa[i][j].setPreferredSize(new Dimension(40, 40));
                panel.add(mesa[i][j]);

            }
        }
        for (int r = 0; r < mesa.length; r++) {
            for (int t = 0; t < mesa[0].length; t++) {
                if (r % 2 == 0 || r == 0) {
                    if (t % 2 == 0 || t == 0) {
                        mesa[r][t].setBackground(Color.BLACK);
                    } else {
                        mesa[r][t].setBackground(Color.WHITE);
                    }
                } else {
                    if (t % 2 == 0 || t == 0) {
                        mesa[r][t].setBackground(Color.WHITE);
                    } else {
                        mesa[r][t].setBackground(Color.BLACK);
                    }
                }
            }
        }

        ventana.setContentPane(panel);
        ventana.setSize(500, 500);
        ventana.setVisible(true);
        Knight kn =new Knight();

        kn.Caballo(mesa, rad.nextInt(9), rad.nextInt(9));
    }
}

任何帮助都将非常感谢。我对Java很陌生,并没有向我解释这一点,所以我一直在苦苦挣扎。

2 个答案:

答案 0 :(得分:1)

matriz[i][j].setBackground(Color.RED);  

您正在尝试从匿名内部类访问“matriz”,因此变量需要是类变量或最终变量。

我会质疑为什么你让这个方法属于Knight类。此方法应该是Tablero类的一部分,因为您将数组定义为类变量。那么你就不会遇到编译问题。

但是如果你真的想把方法保留在Knight类中,那么代码应该是:

public void Caballo(**final** JButton[][] matriz, int i, int j) {
  

一旦我运行它,图像根本不显示

image = new ImageIcon(getClass().getResource("redKnight.gif"));

您只需创建一个Icon。您需要将其添加到标签,然后将标签添加到GUI。

  

我是java的新手,并没有向我解释

首先阅读Swing tutorial。也许How to Use Icons部分可能是一个很好的起点。

答案 1 :(得分:0)

尝试更改此

public void Caballo(JButton[][] matriz, int i, int j)

到这个

public void Caballo(final JButton[][] matriz, final int i, final int j)

变量需要最终的原因是因为它们是在ActionListener的actionPerformed中访问的。 Java需要知道这些变量在使用它们之前不会发生变化。它可以追溯到一个Java垃圾收集器的东西,我宁愿不讨论,但这是它的开玩笑。