5

如果我想在 JavaFx 中以编程方式添加一行文本字段,我可以简单地使用 gridpane add 方法

这会将一组文本字段添加到第 1 行。

for (int i = 0; i < Fields.size(); i++) {
   gridpane.add(new TextField(), i, 1);
}

同样,如何删除一行?我没有找到合适的方法在 JavaFX 中方便地删除行/列。

4

4 回答 4

11

没有直接等效的方法。要删除节点,只需使用 gridpane.getChildren().remove(...);orgridpane.getChildren().removeAll(...);并传入要从窗格中删除的节点。

于 2014-04-11T02:49:39.973 回答
5

在 Java 8+ 中,您可以使用removeIf

gridPane.getChildren().removeIf(node -> GridPane.getRowIndex(node) == rowNumber);

警告
如果从第0 行删除项目,还要检查GridPane.getRowIndex(node) == null,即

node -> GridPane.getRowIndex(node) == null || GridPane.getRowIndex(node) == 0

(我认为这是JavaFX留下的行号,因为null在FXML中的相应元素中没有给出行号,即使在FXML中没有给出行号意味着元素在第0行,因为默认行是第0行。 )

于 2017-12-07T00:32:31.597 回答
2

这很好用:

while(MainGridPane.getRowConstraints().size() > 0){
    MainGridPane.getRowConstraints().remove(0);
}

while(MainGridPane.getColumnConstraints().size() > 0){
    MainGridPane.getColumnConstraints().remove(0);
}
于 2017-04-07T11:29:05.980 回答
0

JavaFX API 非常缺乏(比如很容易从 中删除行GridPane)并且不直观(比如返回null而不是0for GridPane.getRowIndex)。这是我想出的解决方案:

实用程序:

package io.github.againpsychox.javaspeedrunsapp.utils;

import javafx.scene.Node;
import javafx.scene.layout.GridPane;

public class GridPaneUtils {
    /**
     * Gets row index constrain for given node, forcefully as integer: 0 as null.
     * @param node Node to look up the constraint for.
     * @return The row index as primitive integer.
     */
    public static int getRowIndexAsInteger(Node node) {
        final var a = GridPane.getRowIndex(node);
        if (a == null) {
            return 0;
        }
        return a;
    }

    /**
     * Removes row from grid pane by index.
     * Note: Might not work correctly if row spans are used.
     * @param grid Grid pane to be affected.
     * @param targetRowIndexIntegerObject Target row index to be removed. Integer object type, because for some reason `getRowIndex` returns null for children at 0th row.
     */
    public static void removeRow(GridPane grid, Integer targetRowIndexIntegerObject) {
        final int targetRowIndex = targetRowIndexIntegerObject == null ? 0 : targetRowIndexIntegerObject;

        // Remove children from row
        grid.getChildren().removeIf(node -> getRowIndexAsInteger(node) == targetRowIndex);

        // Update indexes for elements in further rows
        grid.getChildren().forEach(node -> {
            final int rowIndex = getRowIndexAsInteger(node);
            if (targetRowIndex < rowIndex) {
                GridPane.setRowIndex(node, rowIndex - 1);
            }
        });

        // Remove row constraints
        grid.getRowConstraints().remove(targetRowIndex);
    }
}

示例用法:

GridPaneUtils.removeRow(this.grid, GridPane.getRowIndex(this.idTextField));

将我的解决方案发布给更多读者......

于 2022-02-02T19:20:29.483 回答