Използване на един 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