Удалите строку gridpane с ее элементами в javafx [duplicate]

a ~ li {
    background: red
}

В css3 добавлен новый селектор, поэтому, если html выглядит так:

<ul>
  <li>
    <a>Some text</a>
  </li>
</ul>

Фактически вы можете воздействовать на родителя элемента «a», который является «li» «

4
задан GOXR3PLUS 10 November 2016 в 05:05
поделиться

2 ответа

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++;
    }
}

Это не работает. Индекс в дочернем списке не имеет значения в другом GridPane, а затем в порядке, в котором они отображаются. Индекс строки / столбца сохраняется на карте properties каждого дочернего элемента. Чтобы изменить их, вам необходимо использовать статический GridPane.setRowIndex метод .

Пример

@Override
public void start(Stage primaryStage) {
    Button btn = new Button("Delete");
    TextField tf = new TextField();

    TextFormatter<Integer> 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<Node> 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);
}
9
ответ дан fabian 19 August 2018 в 13:59
поделиться
  • 1
    Спасибо за быстрый ответ. Я попробую этот код, когда буду дома. Я забыл сказать, что у меня уже есть строка в GridPane (это не город, это просто заголовок), это влияет на ваш код? – Franckyi 10 November 2016 в 07:22
  • 2
    Пока нет пробелов строк, проблем не должно быть. Вам просто нужно использовать правильный индекс строки, т. Е. Если заголовок использует одну строку, а вторая строка (индекс = 1) содержит первый город, вам необходимо передать 1 в deleteRow. – fabian 10 November 2016 в 12:23
  • 3
    О, и у меня другая проблема. RemoveRow работает хорошо, но я не знаю, как изменить строку ... – Franckyi 10 November 2016 в 17:55
  • 4
    @Franckyi в зависимости от того, что вы подразумеваете под «изменением строки». вы можете получить индекс столбца для ребенка так же, как вы получите индекс строки (но используя getColumnIndex вместо getRowIndex), который позволяет вам находить узлы. Если вы хотите добавить больше элементов в строку, в GridPane также есть метод addRow(int index, Node... nodes). – fabian 10 November 2016 в 19:52
  • 5
    Хорошо, я сделал рабочий метод для изменения строки (путем изменения строки, я имею в виду изменение некоторых значений, а не добавление значений), но спасибо в любом случае :) – Franckyi 10 November 2016 в 20:27
0
ответ дан Tillmann 31 October 2018 в 01:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: