首页 > 解决方案 > 如何获取JavaFX程序控制器内部的调用节点

问题描述

我正在做一个 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>

我尝试实现每次单击标签时更改标签文本的功能。但我无法指定哪个是调用该函数的标签。我想知道是否有任何方法可以在 Controller 中获取调用节点?

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

标签: javajavafxfxmlscenebuilder

解决方案


您可以像这样获取源代码:

@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();
    });
}

推荐阅读