2014-10-22 2 views
0

Я сделал JavaFX приложение с gridpane, содержащей Прямоугольники:JavaFX EventHandler на нескольких объектах

private GridPane addGridPane() { 

    GridPane grid = new GridPane(); 
    grid.setHgap(2); 
    grid.setVgap(2); 
    grid.setPadding(new Insets(0, 0, 10, 0)); 

    int rows = 5; 
    int cols = 5; 

    for(int i=1; i<=rows; i++) { 
     for(int j=1; j<=cols; j++) { 
      r = new Rectangle(70, 70, Color.AQUA); 
      grid.add(r, j, i); 
     } 
    } 
    return grid; 
} 

Теперь я хочу Прямоугольник быть заполнены красным, когда мышь нажата на этом прямоугольнике. Для этого я попытался положить, что в секунду для цикла:

r = new Rectangle(70, 70, Color.AQUA); 
r.setOnMouseClicked(new EventHandler<MouseEvent>() 
    { 
     @Override 
     public void handle(MouseEvent t) { 
     r.setFill(Color.RED); 
     } 
    }); 
grid.add(r, j, i); 

Кажется, что каждый прямоугольник имеет это EventHandler, но только последний прямоугольник заполняется красным цветом. Есть ли проблема с Target Event?

+0

Я также пытался использовать t.getSource(). – variables

ответ

0

Проблема заключается в том, что r является полем некоторого объемлющего объекта. Все обработчики ссылаются на это поле, а не на прямоугольник, к которому они привязаны. После цикла for поле r содержит последний прямоугольник, поэтому только последний прямоугольник заполняется красным.

Решение состоит в том, чтобы объявить r в качестве локальной переменной в течение цикла:

for(int i=1; i<=rows; i++) { 
    for(int j=1; j<=cols; j++) { 
     Rectangle r = new Rectangle(70, 70, Color.AQUA); 
     r.setOnMouseClicked(new EventHandler<MouseEvent>() 
      { 
       @Override 
       public void handle(MouseEvent t) { 
       r.setFill(Color.RED); 
       } 
      }); 
     grid.add(r, j, i); 
    } 
} 
0

Это работает, как ожидается, для меня (обратите внимание на локальную переменную г):

for(int i=1; i<=rows; i++) { 
      for(int j=1; j<=cols; j++) { 
       Rectangle r = new Rectangle(70, 70, Color.AQUA); 
       r.setOnMouseClicked(new EventHandler<MouseEvent>() 
       { 
        @Override 
        public void handle(MouseEvent t) { 
         r.setFill(Color.RED); 
        } 
       }); 
       grid.add(r, j, i); 
      } 
     } 
Смежные вопросы