Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx按钮向ActionEvent函数发送参数_Java_Button_Javafx_Fxml_Actionevent - Fatal编程技术网

Javafx按钮向ActionEvent函数发送参数

Javafx按钮向ActionEvent函数发送参数,java,button,javafx,fxml,actionevent,Java,Button,Javafx,Fxml,Actionevent,我正在学习如何使用javafx,以及通过创建一个非常基本的计算器来使用scenebuilder,但我遇到了一个问题,我很难找到一种方法来避免每个按钮都有一个单独的函数。我需要知道按钮是否有办法更改变量或为按钮链接的动作事件方法提供参数,这样我就不需要为每个按钮调用另一个函数使用单独的方法。这是我正在使用的一个示例 @FXML private Button one; private Button two; //both buttons are linked to NumChange privat

我正在学习如何使用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
}
如何让所有数字按钮使用相同的函数,但发送参数,使其可以执行不同的操作


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

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

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

private void numChange(int num) {
    // process num here...
}
然后为每个按钮定义一个不同的处理程序方法,该按钮仅委托给
numChange()

然后在FXML中进行明显的更改:


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


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


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

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

    // ...
}

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



one.setOnAction(事件->NumChange(…)
two.setOnAction(事件->NumChange(…)@Foo请用神奇的詹姆斯,你救了我一天。
@FXML
private void numChange(ActionEvent event) {
    Node node = (Node) event.getSource() ;
    String data = (String) node.getUserData();
    int value = Integer.parseInt(data);

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