Get fx:id from label 单击以从控制器获取其文本

Get fx:id from label clicked to get its text from controller

使用 JavaFX 和 Scene Builder,我试图从控制器访问标签内的文本。

我在controller中初始化了一个标签如下:

@FXML
private Label label1;

fxml文件中有以下代码:

<Label fx:id="lable1" onMouseClicked="#handleLabel" text="Label 1" />

我已经使用场景生成器将标签绑定到控制器中的这个函数:

private void handleLabel(MouseEvent event) { 
// get text from label n
}

我的想法是调用类似 label1.getText() 的东西。但是为此,我需要获取标签的 fx:id,并且由于我将使用许多标签,因此我无法单独对所有 id 案例进行硬编码。

Better way for Getting id of the clicked Object in JavaFX controller 我找到了这个,但我认为这个答案对我不起作用,因为初始化标签和设置 id 似乎无法处理 @FXML。 另外,是否可以访问组件的 fx:id 也没有得到回答。

也欢迎使用任何其他方式访问 Label 对象的方法,例如 getText()

完全不清楚如果你能得到它,你会用 fx:id 做什么。它只是引用 Label 的变量的名称,因此它不是 Label 本身的一部分。即使你确实得到了这个名字,大概是一个字符串,你会怎么做?

您可以使用 event.getSource() 获取对事件源的引用,并假设您 只有 将此方法注册为 Label 的处理程序s,然后您可以将其向下转换为 Label:

private void handleLabel(MouseEvent event) { 
    Label label = (Label) event.getSource();
    String labelText = label.getText();
    System.out.println("Mouse click on label: "+labelText);
}

一般来说,我发现为每个控件设置一个不同的处理程序要好得多,而不是像这样使用一个检查事件源的处理程序。显然,如果您使用 FXML,这会变得非常重复(但是对大量控件使用 FXML 已经是重复的)。最好用 Java 而不是 FXML(或者至少 UI 中包含所有这些标签的部分)。然后你可以为每个注册不同的处理程序而无需重复代码:

VBox lotsOfLabels = new VBox();
for (int i = 1 ; i <= 100; i++) {
    Label label = new Label("Label "+i);
    lotsOfLabels.getChildren().add(label);
    label.setOnMouseClicked(e -> {
        System.out.println("Mouse click on "+label.getText());
        // etc...
    });
}

如果将该代码与创建 100 个标签的 FXML 进行比较(甚至根本不处理事件处理程序),很明显使用 Java 作为 UI 相当比使用 FXML 简单一点。当然,您可以创建一个 VBox 的子 class 来做同样的事情,如果您想要 FXML 中的其余部分,只需从 FXML 文件中引用 class。