如何以编程方式更改GridPane的行数?

时间:2017-12-14 11:36:41

标签: java javafx

我是JavaFX的新手,我正在尝试使用固定数量的列创建 GridPane 行数可变(根据如何我希望在我的视图中插入许多元素)。

我相对于VBox内的每个元素准备了fxml。

我想获得的结果是这样的

+---+  +---+  +---+
|   |  |   |  |   |
+---+  +---+  +---+

+---+  +---+  +---+
|   |  |   |  |   |
+---+  +---+  +---+

+---+  +---+  
|   |  |   |  
+---+  +---+  

元素数量根据我在数据库中的元素数量而变化。

如何在GridPane

中插入自定义元素

如何使其行数以编程方式更改

2 个答案:

答案 0 :(得分:1)

您可以使用GridPane#addRow(int, Node...)

AtomicInteger rowCount = new AtomicInteger();
GridPane gp = new GridPane();
gp.setGridLinesVisible(true);
Button b = new Button("Add Row");
b.setOnAction( e-> gp.addRow(rowCount.getAndIncrement(),
        new Label("Row" + (rowCount.get()-1) + " Col1"),
        new Label("Row" + (rowCount.get()-1) + " Col2")));

vararg参数中的每个Node都将被放入一个新列。

答案 1 :(得分:0)

只是为了展示一个可以在更大的代码库中实现的一般方法

如果我们将以下内容创建为变量

private final GridPane grid = new GridPane();

private Item[][] items;
private int columnCount = 0;
private int rowCount = 0;

下面是一个使用set column和row index methods更新网格窗格的方法

/**
 * Should be called whenever items array changes.
 */
private void render() {

    List<Item> toAdd = new ArrayList<>();
    for (int column = 0; column < columnCount; column++) {
        for (int row = 0; row < rowCount; row++) {
            Item item = getItemAt(column, row);

            // if it is null it wont be painted e.g. empty/blank item
            if (item != null) {
                toAdd.add(item);
                GridPane.setColumnIndex(item, item.getColumn());
                GridPane.setRowIndex(item, item.getRow());
            }
        }
    }

    // add all at once for better performance
    grid.getChildren().setAll(toAdd);
}

这是本课程其余部分的要点 https://gist.github.com/nsavageJVM/5775128a9682ebcf0e8186ff209f4f8e