如果您正在FXML中注册处理程序,则最好的方法实际上是为每个按钮定义不同的方法。您可以按如下方式最小化代码。
为您的numChange(...)
方法定义所需的参数,例如:
private void numChange(int num) {
}
然后为每个按钮定义一个不同的处理程序方法,仅将其委派给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) {
}
}