private void moveNodes(int row, List
nodes) { int i = 0; for (Node node : getNodesFromRow(row)) { this.getChildren().set(getIndex(getColumnIndex(node), getRowIndex(node)), nodes.get(i)); i++; } } Это не работает. Индекс в дочернем списке не имеет значения в другом
GridPane
, а затем в порядке, в котором они отображаются. Индекс строки / столбца сохраняется на картеproperties
каждого дочернего элемента. Чтобы изменить их, вам необходимо использовать статическийGridPane.setRowIndex
метод .Пример
@Override public void start(Stage primaryStage) { Button btn = new Button("Delete"); TextField tf = new TextField(); TextFormatter
formatter = new TextFormatter<>(new IntegerStringConverter()); formatter.setValue(0); tf.setTextFormatter(formatter); btn.disableProperty().bind(IntegerExpression.integerExpression(formatter.valueProperty()).lessThan(0)); GridPane grid = new GridPane(); grid.setHgap(5); grid.setVgap(5); btn.setOnAction((ActionEvent event) -> { deleteRow(grid, formatter.getValue()); }); for (int r = 0; r < 5; r++) { for (int c = 0; c < 3; c++) { grid.add(new Text(r+"_"+c), c, r); } } Scene scene = new Scene(new VBox(new HBox(tf, btn), grid)); primaryStage.setScene(scene); primaryStage.show(); } static void deleteRow(GridPane grid, final int row) { Set deleteNodes = new HashSet<>(); for (Node child : grid.getChildren()) { // get index from child Integer rowIndex = GridPane.getRowIndex(child); // handle null values for index=0 int r = rowIndex == null ? 0 : rowIndex; if (r > row) { // decrement rows for rows after the deleted row GridPane.setRowIndex(child, r-1); } else if (r == row) { // collect matching rows for deletion deleteNodes.add(child); } } // remove nodes from row grid.getChildren().removeAll(deleteNodes); }