javafx中是否有一个 Package 的网格布局?

gkl3eglg  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(378)

我试图搜索我的问题的答案,但我甚至不知道该用谷歌搜索什么来找到答案-所以我在这里的stackoverflow。
在我的应用程序中,我使用java1.8和javafx作为gui。我想添加n个复选框到一个阶段,每个复选框上有一个标签。标签的长度可以是任意数量的字符。这些复选框将由用户在我的应用程序运行时添加。我想允许每行有一个以上的复选框。所以基本上我想有一个表格或网格布局,这样所有的复选框都在网格中对齐。它应该填充第一行,一旦所有的水平空间被占用,它应该开始一个新的行。
现在假设第一行有8个复选框,然后第二行开始填充。如果第二行的标签很长,第二行可能只有6个复选框。我不能在第一行有8列,在第二行有6列,但仍然有所有对齐。因此,现在我必须将网格中的列数更改为6(将两个复选框从第一行移到第二行)并重新布局所有内容。
是否有任何布局或控件来处理此问题?仅供参考-我不想允许水平滚动条。

62o28rlo

62o28rlo1#

我想两者都有 TilePane 以及 FlowPane 接近你所描述的;调整大小的行为可能与您要查找的略有不同。

nqwrtyyt

nqwrtyyt2#

使用tilepane应该适合你的需要。tilepane的实现保证了每一行(最后一行除外)上的tile数相同。
下面是一个简单的例子,展示了这种行为:

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 Package 成滚动窗格(只允许垂直滚动条),以避免tilepane宽度变小时无法访问的元素。

相关问题