【问题标题】:is there a grid layout in javafx that wraps?javafx中是否有网格布局?
【发布时间】:2015-03-13 10:38:13
【问题描述】:

我试图寻找我的问题的答案,但我什至不确定用谷歌搜索什么来找到答案 - 所以我在 stackoverflow 上。

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

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

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

【问题讨论】:

    标签: java layout checkbox javafx


    【解决方案1】:

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

    【讨论】:

    • 谢谢你们!我选择了 tilepane - flowpane 可能也有用。
    【解决方案2】:

    使用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 的宽度变小时时无法访问元素。

    【讨论】:

    • 这正是我所需要的!非常感谢!
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多