#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.