java - 如何设置 GridPane 自动调整以适应 JavaFX 中的内容

标签 java gridview javafx scrollview

我在 ScrollView 内部有一个 GridPane。我在 GridPane 的每个空间中添加图像。首先只有 1 行 3 列。但是,当我传递 3 个图像的数量时,我增加了一行中的 GridPane 并添加了表示网格行高度的数字 (130px)。这是我的代码。

 private void AddItem() {
        ImageView image = new ImageView();
        image.setImage(new Image("media/logo.jpg"));
        image.setFitHeight(50);
        image.setFitWidth(100);
        if (columns > 2) {//when it reaches the end of the columns
            viewGrid.setPrefHeight(viewGrid.getHeight() + 130);//I increase the height of the GridPane
            viewGrid.addRow(rows++);//I add a new row
            columns=0;//I set the column to 0 again
        }

        viewGrid.add(image, columns, rows);
        columns++;
 }

结果

图像开始相互碰撞,而不是保持真实位置:

enter image description here

GridPane 中是否有某些属性可以让我实现所需的行为?

最佳答案

不要手动调整 GridPane 的大小。使用rowConstraints反而。这些允许您指定行的属性,例如对齐和大小约束。 GridPane 将自动更新其高度。

示例

private static final int COLUMN_COUNT = 3;
private int nextColumnIndex = COLUMN_COUNT;
private int currentRow = -1;

@Override
public void start(Stage primaryStage) {
    Image image = new Image("http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a");
    
    GridPane imagePane = new GridPane();
    
    ColumnConstraints colConstraint = new ColumnConstraints(120);
    colConstraint.setHalignment(HPos.LEFT);
    
    RowConstraints rowConstraints = new RowConstraints(130);
    rowConstraints.setValignment(VPos.CENTER);
    
    // add constraints for columns
    imagePane.getColumnConstraints().addAll(colConstraint, colConstraint, colConstraint);

    ScrollPane scroll = new ScrollPane(imagePane);
    scroll.setFitToWidth(true);
    scroll.setPrefSize(380, 300);

    BorderPane root = new BorderPane(scroll);

    Button btn = new Button("Add Image");
    btn.setOnAction((ActionEvent event) -> {
        ImageView newImage = new ImageView(image);
        newImage.setFitHeight(50);
        newImage.setFitWidth(100);
        if (nextColumnIndex >= COLUMN_COUNT) {
            nextColumnIndex = 0;
            currentRow++;
            imagePane.getRowConstraints().add(rowConstraints);
        }
        imagePane.addRow(currentRow, newImage);
        nextColumnIndex++;
    });

    root.setLeft(new VBox(btn));

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}
<小时/>

顺便说一句:addRow方法用于将子项添加到特定行,而不是添加行本身。如果将具有索引(或更大索引)的 Node 添加为子节点,则会自动将一行添加到 GridPane 中。您无需通过调用 GridPane 方法来创建行。

<小时/>

请注意,与您尝试实现的行为类似的行为已在 FlowPane 中实现。 。这将是简化代码的一个选项。只需确保 FlowPane 的宽度选择适当(即连续允许 3 个元素,但不允许 4 个元素)。

示例

@Override
public void start(Stage primaryStage) {
    Image image = new Image("http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a");

    FlowPane imagePane = new FlowPane();
    imagePane.setHgap(20);
    imagePane.setVgap(130 - 50);
    imagePane.setRowValignment(VPos.CENTER);
    imagePane.setColumnHalignment(HPos.LEFT);

    ScrollPane scroll = new ScrollPane(imagePane);
    scroll.setFitToWidth(true);
    scroll.setPrefSize(380, 300);

    BorderPane root = new BorderPane(scroll);

    Button btn = new Button("Add Image");
    btn.setOnAction((ActionEvent event) -> {
        ImageView newImage = new ImageView(image);
        newImage.setFitHeight(50);
        newImage.setFitWidth(100);
        imagePane.getChildren().add(newImage);
    });

    root.setLeft(new VBox(btn));

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

关于java - 如何设置 GridPane 自动调整以适应 JavaFX 中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38167182/

相关文章:

ASP.NET 在存储过程中执行计算,或在 Gridview 中的数据绑定(bind)中执行计算

java - 从 spock 模拟执行回调

java - slf4j 和 log4j 日志文件未附加

java - 向按钮添加两个 Action 监听器似乎不起作用

java - 如何在 JavaFx 中单击按钮时更改变量

JavaFX - TextField 提示文本在更改颜色后不会在聚焦时被删除

JavaFX TreeView 为空

java - Hibernate Session 保存操作是否与底层数据库事务同步?

qt - 如何获取ListModel中特定项目的索引?

c# - 在 gridview 中绑定(bind)标签文本