我在JavaFX中创建了很多按钮,我试图缩短代码。我尝试使用switch语句,但遗憾的是没有结果,因为我收到错误:constant expression required
Object source = e.getSource();
switch (source) {
case equals(leftPerent):
appendText("(");
default:
break;
}
我目前的工作代码只是编写了大量的if语句,是否有可能缩短它?
@FXML
private Button num1, num2, num3;
public void onNumberButtonClick(ActionEvent e) {
if (e.getSource().equals(num1)) {
appendText("1");
}
if (e.getSource().equals(num2)) {
appendText("2");
}
if (e.getSource().equals(num3)) {
appendText("3");
}
}
FXML文件:
<Button text="1" fx:id="num1" onAction="#onNumberButtonClick" GridPane.columnIndex="0" GridPane.rowIndex="0" alignment="CENTER"></Button>
<Button text="2" fx:id="num2" onAction="#onNumberButtonClick" GridPane.columnIndex="1" GridPane.rowIndex="0"></Button>
<Button text="3" fx:id="num3" onAction="#onNumberButtonClick" GridPane.columnIndex="2" GridPane.rowIndex="0"></Button>
不确定这是否有效,因为我不熟悉FXML以及FXML ID是否与编程指定的id相同。
public void onButtonClick(ActionEvent e) {
Button button = (Button) e.getSource();
String id = button.getId();
switch (id) {
case "num1": {
appendText("1");
}break;
{.. etc ?..}
}
}
以编程方式执行此操作时,我通常最终得到:
Button one = new Button();
one.setOnAction(e->{appendText("1");});
但同样,我不知道以编程方式分配事件处理程序是否会破坏任何FXML内容。
避免使用类似这样的switch
语句。仅对相同的功能使用相同的事件处理程序。否则最好使用不同的事件处理程序。
在这种情况下,功能足够相似。我建议尽量避免使用switch
。这样做的好方法是将一些数据附加到源。通常你会使用userData
属性或properties
地图,但在这种情况下你不需要它,因为信息可以通过text
属性获得:
@FXML
private void onNumberButtonClick(ActionEvent e) {
Button source = (Button) e.getSource();
appendText(source.getText());
}
就像是?
Public void onNumberButtonClick(actionevent e) {
Button b = (button) e. Getsource() ;
AppentText(b.gettext());
}