JavaFX中获取按钮的ActionEvent源

3

我有大约10个按钮将被发送到同一个方法中。我希望该方法能够识别其来源,以便知道是按钮“完成”调用了此函数。然后我可以添加一个switch case或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(),然后必须对其进行子字符串处理,以便只显示“完成”。是否有其他方法可以获取撇号中的字符串,而不必进行子字符串处理呢?

更新:我已尝试传递Button并且它有效,但我仍想使用ActionEvent找到解决方案。

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


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

输出结果为操作 1:已完成

2个回答

5
通常我更喜欢为每个按钮使用不同的方法。仅依赖按钮中的文本是一个非常糟糕的想法(例如,如果您想国际化应用程序,逻辑会发生什么变化?)。如果你真的想获取按钮中的文本(再次强调,你真的不想这样做),只需使用向下转型即可:
String text = ((Button)e.getSource()).getText();

我明白了,所以强制转换起作用了。谢谢,这正是我想要的。我总是乐于学习,那你比起这个更喜欢什么? - CookieMonster
@CookieMonster:将数据附加到节点的其他方法:setUserDatagetProperties - fabian

3

正如 @James_D 指出的,仅依赖于向用户显示的按钮文本是一个不好的主意,有许多原因(尽管对您的情况可能足够!)

另一种方法是为按钮分配IDs并在回调方法中检索它们。代码应该如下所示:

// 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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接