Javafx 按钮向 ActionEvent 函数发送参数

标签 java button javafx fxml actionevent

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

@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
}

如何让所有数字按钮使用相同的功能,但向其发送参数以使其执行不同的操作?

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

最佳答案

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

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

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

然后为每个简单委托(delegate)给 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);

    // ...
}

最后,直接在 Controller 中注册处理程序可能会更容易:

<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 函数发送参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902660/

相关文章:

c# - Action 执行按钮可见 false 不起作用

swift - 在 SwiftUI 中,如何增加按钮的高度?

java - 我收到错误 The method setPromptText(String) is undefined for the type TextField

java - 我想运行此代码而不创建类(对象)的实例。是否可以?为什么不?

java - 通过静态类中的方法同步变量

java - 推土机和延迟初始化收集错误

Android - 如何检查按钮背景颜色是否与 View 中的前一个相同(以编程方式)

java - 在 JavaFX 中使用 Map 和 TableView

java - 无法在 JavaFX 表中显示颜色

java - Swing - 显示空白屏幕的 Java 程序