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

#java #javafx

Вопрос:

 //making the circles clickable
   circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent e) { 
          
           
         circle[i].setFill(Color.BLUE);
          
       } 
    });  
 

Есть ли какой-либо способ изменить элемент в i без получения ошибки «Локальная переменная, определенная мной в заключительной области, должна быть окончательной или фактически окончательной»?

Ответ №1:

Этого должно быть достаточно, чтобы скопировать переменную i:

 // making the circles clickable
final int copyOfI = i;
circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
  @Override 
  public void handle(MouseEvent e) { 
    circle[copyOfI].setFill(Color.BLUE);     
  } 
}); 
 

Однако, поскольку массив может измениться позже, я бы скопировал круг:

 final Circle c = circle[i];
c.setOnMouseClicked(new EventHandler<MouseEvent>() { 
  @Override 
  public void handle(MouseEvent e) { 
    c.setFill(Color.BLUE);     
  } 
}); 
 

Ответ №2:

Если вы посмотрите на документы MouseEvent , вы увидите, что в нем есть source поле, которое он наследует от EventObject :

Объект, на котором первоначально произошло Событие.

Так что вы можете использовать это напрямую, вот так:

    circle[i].setOnMouseClicked(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent e) { 
         ((Button)e.source).setFill(Color.BLUE);
       } 
    });  
 

Один совет: setOnMouseClicked() это мероприятие очень низкого уровня. Java предоставляет другие события более высокого уровня, такие как ActionListener . Использование его очень похоже. Вы можете использовать это с circle[i].setActionListener() actionPerformed() помощью метода и переопределить его. Я предлагаю вам прочитать больше о различных доступных слушателях, чтобы вы знали, какого из них выбрать для конкретного мероприятия.

Примечание: все ссылки предназначены для документации Java 7. Обязательно ознакомьтесь с документацией для версии Java, которую вы используете.

Комментарии:

1. @Code-Ученик, я не уверен Button , что актерский состав здесь правильный. Вы также связали awt JavaDoc.