0

我有以下构造函数,它定义 aboard并检查是否JButton单击了三个 s 中的任何一个:

Timer timer = new Timer(500, this);

private boolean[][] board;
private boolean isActive = true;
private int height;
private int width;
private int multiplier = 40;

JButton button1;
JButton button2;
JButton button3;
public Board(boolean[][] board) {
    this.board = board;
    height = board.length;
    width = board[0].length;
    setBackground(Color.black);
    button1 = new JButton("Stop");
    add(button1);
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            isActive = !isActive;
            button1.setText(isActive ? "Stop" : "Start");
        }
    });
    button2 = new JButton("Random");
    add(button2);
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            this.board = randomBoard();
        }
    });
    button3 = new JButton("Clear");
    add(button3);
    button3.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            this.board = clearBoard();
        }
    });
}

但它返回此错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    board cannot be resolved or is not a field
    board cannot be resolved or is not a field

为什么是这样?如何this.board在构造函数中访问?

4

4 回答 4

4

该问题是由于您尝试访问this.board匿名内部类而引起的。由于没有board定义字段,因此会导致错误。

例如这个:

button2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        this.board = randomBoard();
    }
});

为了能够board在匿名内部类中使用变量,您需要删除this或使用类似的东西Board.this.board(如果您想更明确)。

于 2013-05-14T15:37:09.773 回答
0

问题就在这里

button2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        this.board = randomBoard();
    }
});

button2是一个JButton,它没有一个board字段。不要使用this.board. 寻找另一种访问方式board


快速而肮脏的方法是制作board静态,但我相信JButton你可以指定一个父级(你的董事会类),并以board这种方式访问​​该字段。

快速查看JButton 的文档后,我发现了一个getParent方法。我会从那开始。

于 2013-05-14T15:36:13.330 回答
0

这应该有效:

Board.this.board = randomBoard();

问题this与没有板变量的类 ActionListener 有关。但是,Board.this您指定您的意思是 Board 类的董事会成员。这是嵌套类访问外部类变量所需的语法。

于 2013-05-14T15:41:58.183 回答
-1

正如其他人和编译器所说,你没有一个字段(它是一个实例成员),而只有一个局部变量板,一旦构造函数退出,它就会超出范围。

于 2013-05-14T15:40:03.270 回答