JavaFX: организация элементов управления в строках (в gridpane) с помощью FXML


У меня есть графический интерфейс с большим количеством элементов управления (метки, текстовые поля, Comboboxes и флажки). Я упорядочиваю их в виде сетки и хотел бы, чтобы они были в строках и столбцах (как это предусмотрено с разметкой сетки).

Если я использую FXML, я пишу его так:

<GridPane>
   <Label GridPane.rowIndex="0" GridPane.columnIndex="0" text="field1"/>
   <TextField GridPane.rowIndex="0" GridPane.columnIndex="1"/>
   <Label GridPane.rowIndex="1" GridPane.columnIndex="0" text="field2"/>
   <TextField GridPane.rowIndex="1" GridPane.columnIndex="1"/>
</GridPane>

Теперь вопрос: если я хочу добавить строку между строками 0 и 1, мне нужно увеличить индекс строки следующей строки. Теперь давайте возьмем 20 строк и 5 столбцов, где я хотел бы добавить строку после первой. Это было бы создайте большую возможность для меня, чтобы увеличить число строк для каждой строки ниже первой.

Существует ли что-то вроде элемента row, который помещает свои дочерние элементы управления в одну и ту же строку с возрастающими номерами столбцов? Я думаю примерно так:

<GridPane>
   <GridPane.Row>
       <Label text="field1"/>
       <TextField/>
   </GridPane.Row>
   <GridPane.Row>
       <Label text="field2"/>
       <TextField/>
   </GridPane.Row>
</GridPane>

Я знаю о VBox и HBox, что в значительной степени то, что я хочу, но я хочу иметь элементы в Столбцах с фиксированной шириной.

1 2

1 ответ:

Вы можете использовать объект для отслеживания rowIndex.

Java:

public class RowCounter {
    private int currentRowIndex = 0;

    /**
     * Return current rowIndex.
     * @return
     */
    public int getCr() {
        return currentRowIndex;
    }

    /**
     * Return current rowIndex and increase it.
     * @return
     */
    public int getNr() {
        return currentRowIndex++;
    }
}

FXML:

<GridPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <fx:define>
        <RowCounter fx:id="rc" />
    </fx:define>

    <children>
        <Label text="Name:" GridPane.columnIndex="0" GridPane.rowIndex="$rc.cr" />
        <TextField GridPane.columnIndex="1" GridPane.rowIndex="$rc.nr" />

        <Label text="Age:" GridPane.columnIndex="0" GridPane.rowIndex="$rc.cr" />
        <TextField GridPane.columnIndex="1" GridPane.rowIndex="$rc.nr" />

        <Label text="Address:" GridPane.columnIndex="0" GridPane.rowIndex="$rc.cr" />
        <TextField GridPane.columnIndex="1" GridPane.rowIndex="$rc.nr" />
    </children>
</GridPane>