从标签中获取fx:id,点击从控制器获取其文本

san*_*oxj 1 java user-interface javafx fxml scenebuilder

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

我在控制器中初始化了一个标签:

@FXML
private Label label1;
Run Code Online (Sandbox Code Playgroud)

以下代码位于fxml文件中:

<Label fx:id="lable1" onMouseClicked="#handleLabel" text="Label 1" />
Run Code Online (Sandbox Code Playgroud)

我已使用场景构建器将标签绑定到控制器中的此函数:

private void handleLabel(MouseEvent event) { 
// get text from label n
}
Run Code Online (Sandbox Code Playgroud)

我的想法就是打电话label1.getText().但是为此,我需要获得标签的fx:id,因为我会有很多标签,所以我不能单独硬编码所有的id.

在JavaFX控制器中获取被点击对象的id的更好方法 我已经找到了这个,但我不认为这个答案对我有用,因为初始化标签和设置id似乎不适合@FXML.此外,尚未回答是否可以访问组件的fx:id.

任何其他方式如何访问Label对象的方法getText()也是受欢迎的.

Jam*_*s_D 5

fx:id如果你能得到它,你一点都不清楚.它只是引用变量的变量的名称Label,因此它不是Label自身的一部分.即使你确实得到了名字,这可能是一个字符串,你会做什么呢?

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

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

通常,我发现为每个控件使用不同的处理程序要好得多,而不是使用单个处理程序来检查事件的来源.显然,如果你使用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...
    });
}
Run Code Online (Sandbox Code Playgroud)

如果将该代码与FXML进行比较以创建100个标签(甚至根本不处理事件处理程序),很明显将Java用于这样的UI比使用FXML简单得多.当然,你可以创建一个VBox同样的东西的子类,如果你想在FXML中使用其余的,只需从FXML文件中引用该类.