Javafx 按钮向 ActionEvent 函数发送参数
Javafx button sending arguments to ActionEvent function
我正在通过创建一个非常基本的计算器来学习如何使用 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
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()
接受的参数的数量 and/or 类型。
另一个基于 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 和 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
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()
接受的参数的数量 and/or 类型。
另一个基于 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) {
// ...
}
}