JavaFX使用更少的代码检测按钮单击

时间:2019-04-15 20:10:06

标签: java javafx

我正在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>

3 个答案:

答案 0 :(得分:3)

不确定这是否会奏效,因为我不熟悉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内容。

答案 1 :(得分:2)

避免使用类似这样的switch语句。仅将相同的事件处理程序用于功能非常相似的功能。否则,最好使用不同的事件处理程序。

在这种情况下,功能足够相似。我建议仍然避免使用switch。一个很好的方法是将一些数据附加到源。通常,您会使用userData属性或properties映射,但是在这种情况下,您不需要使用此属性,因为可以通过text属性获取信息:

@FXML
private void onNumberButtonClick(ActionEvent e) {
    Button source = (Button) e.getSource();
    appendText(source.getText());
}

答案 2 :(得分:0)

像什么?

fileB.c