【问题标题】:Javafx 2 : How do I delete a row or column in GridpaneJavafx 2:如何删除 Gridpane 中的行或列
【发布时间】:2014-04-11 02:38:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否对列或行设置了一些大小限制?因为这可能会导致列即使是空的也会占用空间。

标签: javafx-2 gridpane


【解决方案1】:

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

【讨论】:

  • 这似乎不会从窗格中删除行或列,如果我尝试通过从最后的行和列中删除 Nodes 来缩小网格,其他行和列不会'不要扩展填充空间,行和列仍然存在......
  • 在 JavaFX 中,布局是自上而下的;即GridPane(及其位置)占用的空间由其父节点确定。所以这听起来像是您如何管理布局的问题(但也可能您的GridPane 上有错误的行和/或列约束)。您可能应该发布一个问题,通过一些代码准确显示您正在尝试做什么。
【解决方案2】:

在 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 行。)

【讨论】:

  • 这应该是||,行索引不能同时为null和0
【解决方案3】:

这很好用:

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

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

【讨论】:

    【解决方案4】:

    JavaFX API 非常缺乏(比如很容易从 GridPane 中删除行)并且不直观(比如返回 null 而不是 0GridPane.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));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多