2013-05-14 4 views
0

У меня есть следующий конструктор, который определяет board и проверяет, является ли какой-либо из трех JButton с уже щелкнуло:Как получить доступ к булеву массиву Java

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 в конструкторе?

+0

Где вы определили 'board'? –

ответ

0

Проблема здесь

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

ваш button2 является JButton, и он не имеет board поле. Не обращайтесь к нему с this.board. Найдите другой способ доступа к board.


Быстрый и грязный способ сделать это было бы сделать board статично, но я уверен, что JButton есть способ для вас, чтобы указать родительские (ваш класс платы), а также доступ к board поля, путь.

После быстрого просмотра The documentation for JButton, я нашел метод getParent. Я бы начал с этого.

4

Проблема вызвана тем, что вы пытаетесь получить доступ к this.board внутри анонимных внутренних классов. Поскольку не определено поле board, это вызывает ошибку.

Например это:

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

Для того, чтобы иметь возможность использовать переменную board внутри ваших анонимных внутренних классов вам необходимо либо удалить this или использовать что-то вроде Board.this.board (если вы хотите быть более явным) ,

+0

Это актуальная проблема. –

+1

Из нестатического внутреннего класса (даже анонимного) вы можете просто получить доступ к переменным-членам внешнего класса, если вы удалите 'this' (так что просто используйте' board = randomBoard(); ') –

+0

Спасибо за указав, что вне @Heuster я отредактировал соответственно – Cemre

-1

Как и другие, и компилятор сказал, что у вас нет поля (которое является instance member), но только плата local variable, которая выходит за пределы области действия, как только заканчивается конструктор.

0

Это должно работать:

Board.this.board = randomBoard(); 

Проблема заключается this связана с классом ActionListener, которые не имеют переменную платы. Однако с Board.this вы указываете, что вы имеете в виду члена правления класса Board. Это синтаксис, который необходимо использовать для вложенных классов для доступа к переменным внешнего класса.

Смежные вопросы