javafx 中是否有包装的网格布局?

is there a grid layout in javafx that wraps?

我正在尝试寻找我的问题的答案,但我什至不确定要 google 什么才能找到答案 - 所以我在 Whosebug 上。

在我的应用程序中,我使用 java 1.8 和 javafx 作为 GUI。我想在舞台上添加 N 个复选框,每个复选框上都有一个标签。标签的长度可以是任意数量的字符。复选框将在我的应用程序运行时由用户添加。我想在每一行上允许超过 1 个复选框。所以基本上我想要一个 table 或网格布局,以便所有复选框都在网格中对齐。它应该填满第一行,一旦所有水平 space 都被占用,它应该开始一个新行。

现在假设第一行有 8 个复选框,然后第二行开始填充。如果第 2 行的标签很长,第二行可能只有 6 个复选框。我不能在第一行有 8 列,在第二行有 6 列,并且仍然对齐所有内容。所以现在我必须将网格中的列数更改为 6(将 2 个复选框从第一行移动到第二行)并重新布局所有内容。

是否有处理此问题的任何布局或控件?仅供参考 - 我不想允许水平滚动条。

我认为 TilePane and FlowPane 都接近您的描述;调整大小行为可能与您正在寻找的略有不同。

使用 TilePane 应该可以满足您的需求。 TilePane 的实现保证每行(最后一行除外)的 tiles 数量相同。

这是一个显示行为的简单示例:

package application;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;

public class Main extends Application {

private String alphabet = "abcdefghijklmnopqrstuvwxyz";
private Label lastLabel = new Label("");

@Override
public void start(Stage primaryStage) {
    try {
        VBox root = new VBox();
        Button btnAdd = new Button("Add label");
        final TilePane tilePane = new TilePane();

        btnAdd.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                Label lbl = new Label(lastLabel.getText()
                        + alphabet.charAt(lastLabel.getText().length()));
                tilePane.getChildren().add(lbl);
                lastLabel = lbl;
            }
        });

        root.getChildren().add(btnAdd);
        root.getChildren().add(tilePane);
        Scene scene = new Scene(root, 400, 400);
        scene.getStylesheets().add(
                getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
    }
}

您必须知道,如果复选框包含很长的文本(相对于您的 windows 宽度),它可能会显着减少 TilePane 的列数!

此外,最好将 TilePane 包装到 ScrollPane 中(仅允许垂直滚动条)以避免在 TilePane 的宽度变小时无法访问元素。