如果我想在 JavaFx 中以编程方式添加一行文本字段,我可以简单地使用 gridpane add 方法
这会将一组文本字段添加到第 1 行。
for (int i = 0; i < Fields.size(); i++) {
gridpane.add(new TextField(), i, 1);
}
同样,如何删除一行?我没有找到合适的方法在 JavaFX 中方便地删除行/列。
没有直接等效的方法。要删除节点,只需使用
gridpane.getChildren().remove(...);
orgridpane.getChildren().removeAll(...);
并传入要从窗格中删除的节点。
在 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行。 )
这很好用:
while(MainGridPane.getRowConstraints().size() > 0){
MainGridPane.getRowConstraints().remove(0);
}
while(MainGridPane.getColumnConstraints().size() > 0){
MainGridPane.getColumnConstraints().remove(0);
}
JavaFX API 非常缺乏(比如很容易从 中删除行GridPane
)并且不直观(比如返回null
而不是0
for 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));
将我的解决方案发布给更多读者......