ActionEvent получить источник кнопки JavaFX

У меня есть около 10 кнопок, которые будут отправлены одним и тем же методом. Я хочу, чтобы метод определял источник. Таким образом, метод знает, что кнопка «Готово» вызвала эту функцию. Затем я могу добавить случай переключения оператора if, чтобы обрабатывать их соответствующим образом. Это то, что я пробовал

//Call:
    btnDone.setOnAction(e -> test(e));


   public void test(ActionEvent e) {
        System.out.println("Action 1: " + e.getTarget());
        System.out.println("Action 2: " + e.getSource());
        System.out.println("Action 3: " + e.getEventType());
        System.out.println("Action 4: " + e.getClass());
    }

Выходной результат:

Action 1: Button@27099741[styleClass=button]'Done'
Action 2: Button@27099741[styleClass=button]'Done'
Action 3: ACTION
Action 4: class javafx.event.ActionEvent

Готов текст на кнопке. Как видите, я мог бы использовать e.getTarget() и/или e.getSource(), тогда мне нужно будет подстроку, чтобы появилось только «Готово». Есть ли другой способ получить строку в апострофе вместо подстроки.

ОБНОВЛЕНИЕ: я попытался передать кнопку, и она работает, но я все еще хочу знать решение, использующее ActionEvent.

//Call:
        btnDone.setOnAction(e -> test(btnDone));


       public void test(Button e) {
            System.out.println("Action 1: " + e.getText());
        }

Выход Action 1: Done


person CookieMonster    schedule 27.02.2016    source источник


Ответы (2)


Обычно я предпочитаю использовать разные методы для каждой кнопки. Как правило, полагаться на текст в кнопке — очень плохая идея (например, что произойдет с логикой, если вы захотите интернационализировать свое приложение?).

Если вы действительно хотите получить текст в кнопке (и снова я должен подчеркнуть, что вы действительно не хотите этого делать), просто используйте приведение вниз:

String text = ((Button)e.getSource()).getText();
person James_D    schedule 27.02.2016
comment
Понятно, так что кастинг сработал. Спасибо, именно то, что я искал. Я всегда открыт для обучения, так что бы вы предпочли вместо этого? - person CookieMonster; 28.02.2016
comment
@CookieMonster: альтернативные способы присоединения данных к узлу: setUserData и getProperties - person fabian; 28.02.2016

Как отметил @James_D, полагаться на текст кнопки, отображаемый пользователю, — плохая идея по разным причинам (хотя, вероятно, этого достаточно для вашего случая!)

Другой подход заключается в том, чтобы назначить идентификаторы кнопкам, а затем получить их в методе обратного вызова. Это будет выглядеть примерно так:

// that goes to the place where you create your buttons
buttonDone.setId("done");

...

// that goes inside the callback method
String id = ((Node) event.getSource()).getId()

switch(id) {
    case "done":
        // your code for "buttonDone"
        break;
}
person Hamburg is nice    schedule 19.05.2020