Javafx按钮向ActionEvent函数发送参数

Foo*_*Foo 4 java javafx button fxml actionevent

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

@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
}
Run Code Online (Sandbox Code Playgroud)

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

我发现的所有答案都涉及到使用按钮的文本,但是我的计算器很奇怪,而且我有拼写出来的字,所以我不能那样做,我该怎么办?

Jam*_*s_D 14

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

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

private void numChange(int num) {
    // process num here...
}
Run Code Online (Sandbox Code Playgroud)

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

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

@FXML
private void handleButtonTwo() {
    numChange(2);
}
Run Code Online (Sandbox Code Playgroud)

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

<Button fx:id="one" onAction="#handleButtonOne" ... />
<Button fx:id="two" onAction="#handleButtonTwo" ... />
Run Code Online (Sandbox Code Playgroud)

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


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

<Button fx:id="one" onAction="#numChange" userData="1" ... />
<Button fx:id="two" onAction="#numChange" userData="2" ... />
Run Code Online (Sandbox Code Playgroud)

然而,这只会导致大量的向下转换和类型转换,这使得它不像以前的解决方案那么有用:

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

<Button fx:id="one" ... />
<Button fx:id="two" ... />
Run Code Online (Sandbox Code Playgroud)

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) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)