Как получить вызывающий узел внутри контроллера программы JavaFX - PullRequest
1 голос
/ 26 февраля 2020

Я делаю программу javafx, и я застреваю, когда пытаюсь позволить многим узлам совместно использовать одну и ту же функцию onAction.

Вот 37 узлов метки внутри программы, и я добавил их в ArrayList и все они имеют одну и ту же функцию blockChange

<Label fx:id="b66" onMouseClicked="#blockChange" text="Label" GridPane.columnIndex="3">
    <font>
        <Font name="System Bold" size="14.0" />
    </font>
</Label>

Я пытался реализовать функцию, которая изменяет текст метки каждый раз, когда я щелкаю метку. Но я не могу указать, какая метка вызывает функцию. Мне интересно, есть ли способ получить вызывающий узел внутри контроллера?

@FXML
void blockChange(MouseEvent event){
    //I want to get the calling label here
}

1 Ответ

2 голосов
/ 26 февраля 2020

Вы можете получить источник, подобный следующему:

@FXML
void blockChange(MouseEvent event) {
    Object source = event.getSource();
    if (source instanceof Label) {
        ((Label) source).setText("new Text");
    }
}

Но, как уже упоминалось в комментариях, если у вас уже есть все метки в одной коллекции, вы можете перебрать коллекцию и добавить EventHandler для каждый из них:

public void initialize(URL url, ResourceBundle rb) {
    //...
    labels.forEach(this::addMouseClickedEventHandler);
}

private void addMouseClickedEventHandler(Label label) {
    label.setOnMouseClicked(event -> {
        label.setText("new text");
        event.consume();
    });
}
...