【问题标题】:JavaFX - Get GridPane to fit parentJavaFX - 获取 GridPane 以适合父级
【发布时间】:2013-01-23 02:39:12
【问题描述】:

我有一个显示几个标签和一个按钮的简单 GridPane,但我似乎无法让它适合父 StackPane。我将如何去制作它以填充它所在的任何容器?

    GridPane g = new GridPane();
    g.add(new Label("Categories"),0,0);
    g.add(new Label("Content"),1,0);        
    Button newCat = new Button("New Category");
    newCat.setOnAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent e) {
            System.out.println("Clicked");
        }
    });       
    g.add(newCat,0,1);
    g.setGridLinesVisible(true);
    StackPane root = new StackPane();
    root.getChildren().add(g);        
    Scene scene = new Scene(root, 300, 250);  
    primaryStage.setScene(scene);
    primaryStage.show();

UI 真的不是我的强项,我们将不胜感激。

【问题讨论】:

    标签: java user-interface resize javafx-2 gridpanel


    【解决方案1】:

    假设您的布局有 2 列和 3 行,您可以一一定义列和行的大小属性:

      <GridPane 
        xmlns:fx="http://javafx.com/fxml/1"    
        id="gridPane" 
        prefHeight="768.0" 
        prefWidth="1024.0">     
    
        <gridLinesVisible>true</gridLinesVisible> 
        <columnConstraints>
            <ColumnConstraints percentWidth="20"  /> 
            <ColumnConstraints percentWidth="80" />        
        </columnConstraints>
    
        <rowConstraints>
            <RowConstraints minHeight="50"/> 
            <RowConstraints percentHeight="80"/>  
            <RowConstraints minHeight="50"/>  
        </rowConstraints> 
    
    </GridPane>
    

    【讨论】:

      【解决方案2】:

      如果有人要寻找答案,这对我来说是这样的:

      @Override
      public void start(Stage stage) throws Exception {
          stage.setTitle("Window title");
          GridPane grid = new GridPane();
      
          gridSetup(grid); // Building my grid elements here (2 columns)
      
          // Setting columns size in percent
          ColumnConstraints column = new ColumnConstraints();
          column.setPercentWidth(30);
          grid.getColumnConstraints().add(column);
      
          column = new ColumnConstraints();
          column.setPercentWidth(70);
          grid.getColumnConstraints().add(column);
      
          grid.setPrefSize(WINDOW_WIDTH, WINDOW_HEIGHT); // Default width and height
          grid.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
      
          Scene scene = new Scene(grid, WINDOW_WIDTH, WINDOW_HEIGHT);
          stage.setScene(scene);
          stage.show();
      }
      

      使用此设置,网格会占用窗口的所有空间并随窗口自动调整大小。

      【讨论】:

        【解决方案3】:

        你应该看到这个link,尤其是关于百分比调整的部分。如果您只有两列,我发现该代码可以工作:

        GridPane grid = new GridPane();
        /* your code */
        ColumnConstraints column1 = new ColumnConstraints();
        column1.setPercentWidth(50);
        grid.getColumnConstraints().add(column1);
        

        【讨论】:

        • 这绝对有效。我快疯了,因为我的网格不适合父母,但现在可以了。并注意:这甚至适用于超过 vtwo coulums,只需相应地调整值!
        • 谢谢,我在答案中添加了您的注释。
        【解决方案4】:

        虽然不明显,但我认为您的 GridPane 已经与其父容器一样大。 如果在“Scene scene = new Scene(root, 300, 250);”之前添加以下2行代码,应该就能看到是怎么回事了。

        root.setStyle("-fx-background-color: yellow;");
        g.setStyle("-fx-border-color: blue;");
        

        【讨论】:

        • 据我所知,它没有扩展到父级
        • GridPane 不知道如何重新分配额外的宽度和高度。你需要定义它。您是否希望第一行占用所有额外的垂直空间而第二列占用所有额外的水平空间?您是否考虑过改用 TableView?
        【解决方案5】:

        与其将 GridPane 放在 StackPane 中,不如将 GridPane 添加到 HBox 或 VBox 中。调整 Gridpane 更方便。顺便说一句,您仍然有一些方法,例如 g.setPrefSize(arg0, arg1);相应地设置您的高度和宽度。

        【讨论】:

        • 我知道,但是通过设置首选大小,它不会将其缩放到父级,它只是设置 FX 将尝试使用的大小,但我会尝试将其放置为 HBox,尽管我有很难相信这会解决我的问题,因为它不会重新调整按钮等其他项目的大小......但我会尝试^^
        • 很抱歉这么说,但是 HBox 或 VBox 对 GridPanes 大小有任何影响,就像让它填充父项一样。
        • @JohnMikaelGundersen 尝试这样并相应地调整您的网格约束。 [链接]pastebin.com/rA0Ch8ET
        猜你喜欢
        • 2015-06-23
        • 2014-11-12
        • 2014-05-09
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多