2014-01-22 3 views
0

Я пытаюсь сделать это, когда нажата кнопка, я могу изменить один из ее свойств.Javafx2 кнопку изменения при нажатии

class Tile extends Button{ 
    public int position[]; 
    public Tile(){ 
    super(); 
    position = 0; 
    } 

} 

Где инициализирован:

{ 
    Tile tiles [][] = new Tile[10][10]; 
    for(int i=0; i<10; i ++){ 
    for(int j =0; j<10; j++){ 
     tiles[i][j].position = i*10+j; 
     tiles[i][j].addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 
       @Override 
       public void handle(MouseEvent e) { 
        System.out.println(((Tile)(e.getSource())).position[1]); //this results in a null pointer 
       } 
      }); 
    } 
    } 
} 

Я хотел бы программу для распечатки значения позиции в плитке, когда она нажата. Есть ли способ доступа к объекту, к которому относится событие? Мне действительно нужно знать, какая плитка в массиве была нажата. Редактирование: Когда я пытаюсь использовать e.getSource(), я получаю исключение NullPointerException

ответ

2

Позиция объявлена ​​Array, но вы используете ее как Int.

Изменение его на простой int должно устранить вашу проблему.

class Tile extends Button{ 
    public int position; 
    public Tile(){ 
    super(); 
    position = 0; 
    } 

} 

Метод инициализации:

{ 
    Tile tiles [][] = new Tile[10][10]; 
    for(int i=0; i<10; i ++){ 
    for(int j =0; j<10; j++){ 
     tiles[i][j].position = i*10+j; 
     tiles[i][j].addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 
       @Override 
       public void handle(MouseEvent e) { 
        System.out.println(((Tile)(e.getSource())).position); 
       } 
      }); 
    } 
    } 
} 
+0

Я пробовал это, но он продолжает давать мне нулевой указатель. Я отредактировал вопрос, чтобы отразить то, что я использовал. – LucienK

+0

Вы указали позицию как массив из int, но вы назначаете ему int. Отсюда - нулевой указатель. – Alexandre

+0

Whups, это было на самом деле потому, что я никогда не инициализировал массив. Сейчас у меня это работает. Спасибо за помощь! – LucienK

2

Как заявил пользователя PeekaySwitch, вы можете получить источник события, инициированной кнопкой, и в этом случае это кнопка. Все, что вам нужно сделать, это применить бросок, чтобы получить вам правильный тип нужного объекта:

@Override public void handle(ActionEvent e) 
{ 
    Button button = (Button) e.getSource(); 
} 

После этого, вам просто нужно, чтобы получить свойство объекта и обрабатывает их так, как вы хотите. Не забывайте, что types of events в JavaFX - все это часть Java standard library.

Что касается его исключительного значения null, вы делаете основную ошибку языка. Следующий фрагмент кода вы начинаете ссылку на массив объектов:

Tile tiles [][] = new Tile[10][10]; 

Однако, вы не начинаем объекты в векторе. Попробуйте начать каждый объект Tile, выполнив следующие действия:

tiles[i][j] = new Tile(); 

Поместите этот код внутри вложенных циклов, и перед использованием каждого объекта Tile.

Надеюсь, это вам поможет. Удачи.

+0

Также действительные исправления коду, который я опубликовал (который имел несколько ошибок из-за ввода на ipad из памяти). Спасибо за помощь, я понял. – LucienK

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