在javafx中有一个网格布局包装?

时间:2015-01-15 04:00:25

标签: java layout checkbox javafx

我正在尝试搜索我的问题的答案,但我甚至不确定谷歌要找到答案 - 所以我在堆栈上。

在我的应用程序中,我使用带有javafx的java 1.8 for GUI。我想在舞台上添加N个复选框,每个复选框上都有一个标签。标签的长度可以是任意数量的字符。当我的应用程序运行时,用户将添加复选框。我想在每一行上允许多个复选框。所以基本上我想要一个表格或网格布局,所以所有复选框都在网格中对齐。它应填写第一行,一旦占用所有水平空间,它应该开始一个新行。

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

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

2 个答案:

答案 0 :(得分:1)

使用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);
    }
}

你必须知道,如果一个复选框包含一个非常长的文本(相对于你的窗口宽度),它可能会大大减少你的TilePane的列数!

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

答案 1 :(得分:0)

我认为TilePaneFlowPane都接近你描述的内容;调整大小行为可能与您要查找的内容略有不同。