JavaFX按钮将参数发送到ActionEvent函数

5

我正在学习如何使用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(...)); - Kachna
3
@Foo 请使用标准命名约定 - James_D
1个回答

23

如果您正在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的解决方案是,通过设置它们的用户数据来将值与节点相关联,这避免了每个按钮都有一个专用方法。

<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" ... />
and
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) {
        // ...
    }
}

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