使用JavaFX和Scene Builder,我试图从控制器访问Label内的文本。
我在控制器中按如下方式初始化了一个标签:
@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()
。
答案 0 :(得分:5)
如果你能得到它,你会对fx:id
做些什么一点都不清楚。它只是引用Label
的变量的名称,因此它不是Label
本身的一部分。即使你确实得到了名字,这可能是一个字符串,你会做什么呢?
您可以使用event.getSource()
获取对事件来源的引用,并假设您仅将此方法注册为Label
的处理程序,那么您可以将其转发为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...
});
}
如果将该代码与FXML进行比较以创建100个标签(甚至根本不处理事件处理程序),很明显将Java用于这样的UI比使用FXML简单得多。当然,您可以创建一个VBox
的子类来完成相同的操作,如果您想在FXML中完成其余的操作,只需从FXML文件中引用该类。