2016-02-15 8 views
2

У меня есть GUI с большим количеством элементов управления (Ярлыки, Текстовые поля, Комбобокс и флажки). Я организую их в Gridpane и хотел бы иметь их в строках и столбцах (например, он предназначен для макета сетки).JavaFX: Организовать элементы управления в строках (в gridpane) с помощью FXML

Если я использую 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 столбцов, где я хотел бы добавить строку после первой. Это создало бы большую возможность для меня увеличить количество рулонов для каждой строки ниже первой.

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

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

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

+0

хотя у меня нет ответа на ваш вопрос, вы рассматривали использование 'SceneBuilder'? –

+0

спасибо за предложение. Действительно, я уже пробовал это, но обнаружил, что он слишком медленный с большим количеством элементов. Кроме того, обработка иногда очень сложна. Но это может помочь сделать перенумерование строк – user1571117

ответ

4

Вы можете использовать объект для отслеживания 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> 
+0

, к сожалению, я остановил любую разработку JavaFX. После многих чтений в Интернете я не нашел подходящего решения, но это могло бы работать. Я приму свой ответ, поскольку он кажется самым перспективным. Спасибо, и я буду рассматривать его, если я когда-либо буду развиваться в JavaFX снова :) – user1571117

+0

Он работает, но не забудьте добавить импорт RowCounter :) – bamboofighter