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

问题描述 投票:0回答:3

我在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>
java javafx
3个回答
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内容。


2
投票

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

在这种情况下,功能足够相似。我建议尽量避免使用switch。这样做的好方法是将一些数据附加到源。通常你会使用userData属性或properties地图,但在这种情况下你不需要它,因为信息可以通过text属性获得:

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

0
投票

就像是?

Public void onNumberButtonClick(actionevent e) {
    Button b = (button) e. Getsource() ;
    AppentText(b.gettext());
} 
© www.soinside.com 2019 - 2024. All rights reserved.