Использование одного метода JavaFX для нескольких кнопок

Сейчас я использую Eclipse Luna, JavaFX и SceneBuilder. У меня есть ~ 40 кнопок, и я хотел бы использовать общий метод действия «buttonPressed», который может использовать каждая кнопка. Что-то вроде этого:

public void buttonPressed(ActionEvent event, Button b) {
    b.setText("Pressed");
}

Однако, когда я меняю панель On Action в SceneBuilder, я получаю следующее исключение при попытке запустить свою программу:

javafx.fxml.LoadException: ошибка при разрешении onAction='#buttonPressed', либо обработчик события не находится в пространстве имен, либо в скрипте есть ошибка.

Есть ли шаг, который я пропустил? Или кто-нибудь знает альтернативный способ использования одного метода для управления поведением нескольких кнопок при нажатии?

Любая помощь приветствуется!


person JonnyH    schedule 02.02.2015    source источник
comment
Просто чтобы добавить к моему первоначальному вопросу; Похоже, проблема заключается в передаче Button b в качестве параметра. Его удаление и указание кнопки внутри метода устраняет исключение (но не проблему, поскольку метод теперь может использоваться только одной кнопкой). Возможно, есть другой способ определить, какая кнопка нажата, а затем передать ее методу?   -  person JonnyH    schedule 03.02.2015


Ответы (1)


Как и в вашем комментарии, единственными подписями, разрешенными для атрибута onAction, являются либо нулевые аргументы, либо один аргумент, который является ActionEvent.

Вы можете получить источник события следующим образом:

@FXML
public void buttonPressed(ActionEvent event) {
    Object source = event.getSource();
    // ...
}

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

@FXML
public void buttonPressed(ActionEvent event) {
    Button button = (Button) event.getSource();
    // ...
}
person James_D    schedule 02.02.2015
comment
Спасибо, я смог добиться желаемого результата :D Я использовал следующее: public void buttonPressed(ActionEvent event) { Object source = event.getSource(); ((Labeled) source).setText("1"); } (Labeled) было автоматически сгенерированным исправлением, которое вставил Eclipse, и я не видел его раньше. Знаете ли вы, является ли это проблемой/плохой практикой? - person JonnyH; 03.02.2015
comment
Я вообще не люблю унылых. Они несколько склонны к ошибкам времени выполнения: например, если позже вы зарегистрировали свой слушатель с чем-то, что не было Labeled (например, MenuItem), тогда ваш код скомпилируется, но вы получите ошибки времени выполнения. Здесь это, вероятно, нормально; если вы регистрируете обработчик кнопок в FXML и у вас много кнопок, это ваш единственный вариант, кроме одного метода для каждой кнопки. - person James_D; 03.02.2015