【问题标题】:How to change the text of a JavaFX label via the label's ID?如何通过标签的 ID 更改 JavaFX 标签的文本?
【发布时间】:2022-08-20 00:56:32
【问题描述】:

如何仅通过 ID 更改 JavaFX 标签的文本? 代码的简化版本如下所示。

对于上下文,我们有一个标签网格(GridPane)(它是一个数独游戏),标签从 Label_0_0,...,到 Label_8_8(表示网格中的位置)编号。我们正在嵌套 for 循环中遍历标签网格,并尝试使用 for 循环当前坐标处的 ID 在不同的标签/网格框上设置不同的数字。 (为简单起见,我在代码示例中省略了 for 循环等。)

我已经在整个互联网上搜索了答案,但还没有弄清楚,非常感谢任何帮助:)

String labelID = \"ID_1\";
int index = 5;

Label currentlySelectedLabel = (Label) ???; // sth like xx.getElementByID, if that existed
currentlySelectedLabel.setText(Integer.toString(index));

对 FXML 中标签的一些引用:

...
            <Label fx:id=\"Label_8_6\" alignment=\"CENTER\" onMouseClicked=\"#MyFrstLabelClicked\" onMouseMoved=\"#OnMouseMovedOnLabel\" prefHeight=\"44.0\" prefWidth=\"46.0\" text=\"0\" GridPane.columnIndex=\"6\" GridPane.rowIndex=\"8\" />
            <Label fx:id=\"Label_8_7\" alignment=\"CENTER\" onMouseClicked=\"#MyFrstLabelClicked\" onMouseMoved=\"#OnMouseMovedOnLabel\" prefHeight=\"44.0\" prefWidth=\"46.0\" text=\"0\" GridPane.columnIndex=\"7\" GridPane.rowIndex=\"8\" />
            <Label fx:id=\"Label_8_8\" alignment=\"CENTER\" onMouseClicked=\"#MyFrstLabelClicked\" onMouseMoved=\"#OnMouseMovedOnLabel\" prefHeight=\"44.0\" prefWidth=\"46.0\" text=\"0\" GridPane.columnIndex=\"8\" GridPane.rowIndex=\"8\" />
            </children>
        </GridPane>
    </center>
</BorderPane>
  • 你所说的“ID”是什么意思? CSS ID?你没有对标签的引用吗?
  • 检查了几种方法here

标签: user-interface javafx label


【解决方案1】:

首选方法:使用参考而不是查找

一种优选的方法是存储对节点的引用并使用存储的引用。这样您就不会失去强类型、编译时检查和 IDE 智能编辑辅助的所有优点。

有关首选方法的示例,请参见:

此外,更重要的项目可能会受益于 MVC 方法,因此对模型所做的更新会自动反映在节点中(反之亦然):

执行查找

您可以通过node lookup call on a nodenode lookup call on a scene 按CSS ID 查找节点。

例如:

Label lookedupLabel = (Label) scene.lookup("#myId");

该调用采用 CSS 选择器来查找匹配节点。

根据给定的 CSS 选择器查找此节点或第一个子节点。如果此节点是父节点,则此函数将向下遍历分支,直到找到匹配项。如果多个子节点与指定的选择器匹配,则此函数返回其中的第一个。

此方法假定已通过调用 setId 在节点上设置了 ID:

node.setId("myId");

或者在 FXML 中定义节点时,您可以设置 fx:id 属性:

fx:id="myId"

id 属性:

id="myId"

两者都可以,但只设置fx:id 通常更方便,因为除了CSS id 之外,它还会在控制器中设置相应的@FXML 参考值。

生成布局通道

对于查找功能,您可能需要通过调用执行布局传递:

parentNode.applyCss();
parentNode.layout();

如果出现以下情况,请在 CSS 查找之前执行布局传递:

  1. 您已修改当前脉冲中的场景图,或者
  2. 您正在尝试查找将由控件的外观动态创建的节点,或者
  3. 您想查找所查找的节点的维度。

    如果未执行布局传递,则可能找不到查找的节点或可能报告不正确的属性值。

    有关布局传递的更多信息,请参见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多