Eliminar una fila de un GridPane

Estoy usando unGridPane para almacenar información sobre ciudades (en un juego), pero a veces quiero eliminar algunas líneas. Esta es la clase que uso para miGridPane :

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.franckyi.kingsim.city.City;

import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;

public class CityGrid extends GridPane {

    private List<City> cities;

    public CityGrid() {
        super();
        cities = new ArrayList<City>();
    }

    public List<City> getCities() {
        return cities;
    }

    public void deleteCity(int row) {
        cities.remove(row - 1);
        removeNodes(getNodesFromRow(row));
        int i = row;
        while (!getNodesFromRow(i + 1).isEmpty()) {
            moveNodes(i + 1, getNodesFromRow(i + 1));
            removeNodes(getNodesFromRow(i + 1));
            i++;
        }
    }

    public void addCity(City city) {
        cities.add(city);
        int col = 0;
        List<Node> rowNodes = new ArrayList<Node>();
        Button mod = new Button("Modify");
        mod.setOnAction(event -> {

        });
        Button del = new Button("Delete");
        del.setOnAction(event -> {
            deleteCity(getRowIndex(del));
        });
        rowNodes.addAll(Arrays.asList(new CheckBox(), new Text(city.getName()), new Text(city.getStatus().getText()),
                new Text(city.getTrade() + ""), new Text(city.getCost() + ""), new Text(city.getTroops() + ""), mod,
                del));
        for (Node n : rowNodes) {
            n.setId(cities.size() + "");
            this.add(n, col, cities.size());
            col++;
        }
    }

    private List<Node> getNodesFromRow(int i) {
        List<Node> list = new ArrayList<Node>();
        for (Node n : getChildren()) {
            if (getRowIndex(n).equals(i)) {
                list.add(n);
            }
        }
        System.out.println(list.size());
        return list;
    }

    private void removeNodes(List<Node> list) {
        for (Node node : list) {
            this.getChildren().remove(getIndex(getColumnIndex(node), getRowIndex(node)));
        }
    }

    private void moveNodes(int row, List<Node> nodes) {
        int i = 0;
        for (Node node : getNodesFromRow(row)) {
            this.getChildren().set(getIndex(getColumnIndex(node), getRowIndex(node)),
                    nodes.get(i));
            i++;
        }
    }

    private int getIndex(int col, int row) {
        int i = 0;
        for (Node node : getChildren()) {
            if (getColumnIndex(node) == col && getRowIndex(node) == row)
                return i;
            i++;
        }
        return 0;
    }

}

losaddCity La función funciona perfectamente. losdeleteCity La función también funciona cuando borro la última ciudad agregada. Pero cuando elimino una ciudad, elimina automáticamente TODAS las ciudades agregadas después de la que elimino, y no quiero eso.

También debe notar que cada vez que elgetNodesFromRow(int i) Se ejecuta el método, imprime el número de nodos en la fila seleccionada. Cuando agrego dos ciudades y elimino la primera, esto es lo que obtengo en la consola: 8, 0, 8, 8, 8, 8, 8, 0.

Alguien me puede ayudar ? (Dime si quieres todo el código necesario para reproducirlo en casa)

Respuestas a la pregunta(2)

Su respuesta a la pregunta