Javafx 按钮向 ActionEvent 函数发送参数

Posted

技术标签:

【中文标题】Javafx 按钮向 ActionEvent 函数发送参数【英文标题】:Javafx button sending arguments to ActionEvent function 【发布时间】:2016-10-20 12:52:54 【问题描述】:

我正在通过创建一个非常基本的计算器来学习如何使用 javafx 以及 scenebuilder,但是我遇到了一个问题,我很难找到一种方法来不为每个按钮提供单独的功能。我需要知道按钮是否有办法更改变量或为按钮链接到的动作事件方法提供参数,因此我不需要每个按钮单独的方法来调用另一个函数。这是我正在使用的示例。

@FXML
private Button one;
private Button two;
//both buttons are linked to NumChange

private void NumChange(ActionEvent e) 
    //update the number to preform an operation with here

如何让所有数字按钮使用相同的功能,但发送参数,以便它可以做不同的事情?

我找到的所有答案都涉及使用获取按钮的文本,但是我的计算器很奇怪,而且我在它们上面有拼写的单词,所以我不能这样做,我该怎么办?

【问题讨论】:

one.setOnAction(event -> NumChange(...)); two.setOnAction(event -> NumChange(...)); @Foo 请使用standard naming conventions 【参考方案1】:

如果您在 FXML 中注册处理程序,最好的方法是为每个按钮定义不同的方法。您可以按如下方式最小化代码。

定义您的 numChange(...) 方法以获取所需的参数,例如

private void numChange(int num) 
    // process num here...

然后为每个简单地委托给numChange()的按钮定义一个不同的处理程序方法:

@FXML
private void handleButtonOne() 
    numChange(1);


@FXML
private void handleButtonTwo() 
    numChange(2);

然后在 FXML 中做出明显的改变:

<Button fx:id="one" onAction="#handleButtonOne" ... />
<Button fx:id="two" onAction="#handleButtonTwo" ... />

当然,您可以根据需要更改numChange() 接受的参数的数量和/或类型。


另一种基于 FXML 的解决方案是,通过设置用户数据将值与 FXML 中的节点关联起来,从而避免每个按钮都有专用方法:

<Button fx:id="one" onAction="#numChange" userData="1" ... />
<Button fx:id="two" onAction="#numChange" userData="2" ... />

然而,这只会导致大量的向下转换和类型转换,恕我直言,这使得它不如以前的解决方案有用:

@FXML
private void numChange(ActionEvent event) 
    Node node = (Node) event.getSource() ;
    String data = (String) node.getUserData();
    int value = Integer.parseInt(data);

    // ...


最后,直接在控制器中注册处理程序可能更容易:

<Button fx:id="one" ... />
<Button fx:id="two" ... />

public class Controller 

    @FXML
    private Button one ;

    @FXML
    private Button two ;

    public void initialize() 
        one.setOnAction(e -> numChange(1));
        two.setOnAction(e -> numChange(2));
    

    private void numChange(int value) 
        // ...
    

【讨论】:

了不起的詹姆斯,你拯救了我的一天。

以上是关于Javafx 按钮向 ActionEvent 函数发送参数的主要内容,如果未能解决你的问题,请参考以下文章

JAVAFX添加按钮事件备忘

JavaFX:当用户选中复选框时,CheckBoxTableCell 获取 ActionEvent

javafx2 用一个按钮 怎么关闭当前 窗体 类似红叉功能

JavaFx,@FXML 的问题

JavaFX 动态添加新的文本字段

Eclipse没有运行JavaFX应用程序 - 运行'java'应用程序