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。
使用 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。