访问 JavaFX SceneBuilder 应用程序中的字段

Accessing fields in a JavaFX SceneBuilder app

Intellij IDEA + Oracle JDK 14 + JavaFX 14

我正在制作一个简单的 JavaFX 计算器风格的应用程序,并使用 SceneBuilder。

有没有更简单的方法来引用 SceneBuilder 构建的应用程序中的字段,而不是引用单独的唯一 fx:id?例如,如果我有一个内置于 SceneBuilder 的 UI,它有一些数据行和列:

---------------------
| field00 | field01 |
| field10 | field11 |
---------------------

我想对数据做一些数学运算。有没有比引用静态名称更简单的方法来引用字段?

@FXML private TextField field00;
@FXML private TextField field01;
@FXML private TextField field10;
@FXML private TextField field11;

我正在做一些非常天真的事情,比如:if field00 is not null and if field01 is not null and ...。我通过创建一个 class 来表示每一行,并且将这些对象读入一个 ArrayList,使其变得更好一些,但是我创建对象的代码仍然是丑陋的东西,例如:

RowList myRowList = new RowList();

MyRowClass aRow =
    new MyRowClass(
        Double.parseDouble(field00.getText()),
        Double.parseDouble(field01.getText()));
myRowList.addRow(aRow);

aRow =
    new Assignment(
        Double.parseDouble(field10.getText()),
        Double.parseDouble(field11.getText()));
myRowList.addRow(aRow);

我希望能够以某种方式遍历字段。

此外,我想向 UI 添加一个“添加行”按钮,并将该行包含在计算中,这会在混合中引入一些非静态命名的字段。

这里的解决方案是跳过 SceneBuilder 并直接在我的代码中创建 UI 吗?

如果将 TextFields 放入 HBox 等容器中,则可以对容器对象使用 .getChildren() 方法来获取其所有子节点。然后你可以像这样遍历所有这些:

HBox h = new HBox();
h.getChildren().add(new TextField());
h.getChildren().add(new TextField());
h.getChildren().add(new TextField());

// loop through each node in the HBox
for (Node n : h.getChildren())
{
    // if the Node is of type TextField, and the text inside is not null
    if (n instanceof TextField && ((TextField) n).getText() != null)
    {
        // do something
    }
}