【问题标题】:Get fx:id from label clicked to get its text from controller从单击的标签中获取 fx:id 以从控制器中获取其文本
【发布时间】:2017-04-21 19:19:22
【问题描述】:

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

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

@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()

【问题讨论】:

  • ((Label)event.getSource()).getText()? (即使你能得到fx:id ,你不能,你怎么用它来调用getText()??)
  • 这个想法是做 label1.getText()。由于 fx:id 是 label1,我想我可以使用 id 的名称 .getText()。但你的方法也行得通。但答案是您无法访问 fx:id 但必须找到解决方法。谢谢!
  • 但是你不会有label1(这是一个对象引用):你会有一个包含文本"label1"String 变量,这根本不是一回事。那你会怎么做?
  • 请注意,您的示例代码有错字,而不是fx:id="lable1",您应该使用fx:id="label1"。也许这个错字或可能与 CSS id 混淆导致您创建了一个XY problem
  • 你说你“会有很多标签,我不能单独硬编码所有的 id 案例”,所以也许你的解决方案可能是通过循环在代码中创建标签并将它们放在 ObservableList 中而不是具有在 FXML 中定义的标签。 FXML fx:ids 是硬编码的。

标签: java user-interface javafx fxml scenebuilder


【解决方案1】:

如果你能得到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);
}

通常,我发现为每个控件使用不同的处理程序要好得多,而不是像这样使用单个处理程序来检查事件的源。显然,如果您使用 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 的子类来做同样的事情,如果您想要 FXML 中的其余部分,只需从 FXML 文件中引用该类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多