JavaFX обнаруживает нажатия кнопок с меньшим количеством кода - PullRequest
0 голосов
/ 15 апреля 2019

Я создаю много кнопок в 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 ]

3 голосов
/ 15 апреля 2019

Не уверен, что это сработает, поскольку я незнаком с FXML и совпадает ли идентификатор FXML с программно назначенным идентификатором.

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 голосов
/ 16 апреля 2019

Старайтесь не использовать что-то вроде этого switch такого утвержденияИспользуйте только тот же обработчик событий для функций, которые достаточно похожи.В противном случае лучше использовать разные обработчики событий.

В этом случае функциональность достаточно похожа.Тем не менее, я рекомендую избегать использования switch.Хороший способ сделать это - прикрепить некоторые данные к источнику.Обычно вы используете свойство userData или карту properties, но в этом случае вам это не нужно, поскольку информация доступна через свойство text:

@FXML
private void onNumberButtonClick(ActionEvent e) {
    Button source = (Button) e.getSource();
    appendText(source.getText());
}
0 голосов
/ 16 апреля 2019

Что-то вроде?

Public void onNumberButtonClick(actionevent e) {
    Button b = (button) e. Getsource() ;
    AppentText(b.gettext());
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...