【问题标题】:How to get the calling node inside the controller of JavaFX program如何获取JavaFX程序控制器内部的调用节点
【发布时间】:2020-02-26 02:18:29
【问题描述】:

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

【问题讨论】:

  • MouseEvent继承方法getSource()
  • 我总是更喜欢给每个节点自己的监听器。由于您已经将这些放在列表中,您可以遍历列表并为每个节点注册一个侦听器(在控制器的 initialize() 方法中)。这样,触发事件的标签就是注册监听器的标签;这样可以避免调用 getSource() 并向下转换结果。
  • 哦,非常感谢您提供这些信息

标签: java javafx fxml scenebuilder


【解决方案1】:

你可以这样获取源码:

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

但正如 cmets 中所述,如果您已经拥有一个集合中的所有标签,则可以遍历该集合并为每个标签添加 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();
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多