【问题标题】:How do I get buttons to fill a javafx gridpane?如何获取填充 javafx 网格窗格的按钮?
【发布时间】:2016-02-11 16:24:20
【问题描述】:

Java Swing 有GridLayout,它允许您指定小部件数组的大小,例如 3X4。然后小部件填充它们占据的面板。如何在 JavaFX 中获得类似的效果?

【问题讨论】:

    标签: layout javafx-2 javafx-8


    【解决方案1】:

    我想您是在问如何让节点填充网格窗格中分配给其单元格的空间。

    有几种方法可以做到这一点。您可以使用静态GridPane 方法将GridPane 特定属性设置应用于节点:

    GridPane.setFillWidth(myButton, true);
    GridPane.setFillHeight(myButton, true);
    

    另一种方法是在网格窗格本身上指定列约束和行约束:

    GridPane grid = new GridPane();
    for (int rowIndex = 0; rowIndex < numRows; rowIndex++) {
        RowConstraints rc = new RowConstraints();
        rc.setVgrow(Priority.ALWAYS) ; // allow row to grow
        rc.setFillHeight(true); // ask nodes to fill height for row
        // other settings as needed...
        grid.getRowConstraints().add(rc);
    }
    for (int colIndex = 0; colIndex < numColumns; colIndex++) {
        ColumnConstraints cc = new ColumnConstraints();
        cc.setHgrow(Priority.ALWAYS) ; // allow column to grow
        cc.setFillWidth(true); // ask nodes to fill space for column
        // other settings as needed...
        grid.getColumnConstraints().add(cc);
    }
    

    在任何一种情况下,您都需要让节点增长,以便它们尊重网格窗格提出的增长请求。所以,例如:

    Button myButton = new Button("Click");
    myButton.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
    grid.add(myButton, 0, 0);
    

    SSCCE(使用行列约束法):

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.ColumnConstraints;
    import javafx.scene.layout.GridPane;
    import javafx.scene.layout.Priority;
    import javafx.scene.layout.RowConstraints;
    import javafx.stage.Stage;
    
    public class KeyPad extends Application {
    
        @Override
        public void start(Stage primaryStage) {
            GridPane grid = new GridPane();
            int numRows = 4 ;
            int numColumns = 3 ;
            for (int row = 0 ; row < numRows ; row++ ){
                RowConstraints rc = new RowConstraints();
                rc.setFillHeight(true);
                rc.setVgrow(Priority.ALWAYS);
                grid.getRowConstraints().add(rc);
            }
            for (int col = 0 ; col < numColumns; col++ ) {
                ColumnConstraints cc = new ColumnConstraints();
                cc.setFillWidth(true);
                cc.setHgrow(Priority.ALWAYS);
                grid.getColumnConstraints().add(cc);
            }
    
            for (int i = 0 ; i < 9 ; i++) {
                Button button = createButton(Integer.toString(i+1));
                grid.add(button, i % 3, i / 3);
            }
            grid.add(createButton("#"), 0, 3);
            grid.add(createButton("0"), 1, 3);
            grid.add(createButton("*"), 2, 3);
    
            Scene scene = new Scene(grid);
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        private Button createButton(String text) {
            Button button = new Button(text);
            button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
            button.setOnAction(e -> System.out.println(text));
            return button ;
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 在 CSS 中实现:(在我的情况下,设置 maxwidth infinity 就足够了).mygridPane Button{ -fx-max-width: infinity; }
    【解决方案2】:

    我想完成 James_D 的回答。我想展示如何使用 SceneBuilder 实现相同的结果。

    在 SceneBuilder 中选择要增长的节点并将“最大宽度”和“最大高度”设置为 MAX_VALUE

    【讨论】:

      【解决方案3】:

      您可以为此使用 JavaFX 中的 GridPane。在 Java-Code 中,您可以通过

      创建它
      GridPane pane = new GridPane();
      

      并向其添加不同的节点,例如像

      Label label = new Label();
      pane.add(label, 0,0);
      

      这将为 GridPane 的第一行和第一列添加一个标签。 对于更复杂的 GUI,您可以使用 SceneBuilder。

      【讨论】:

      • 我知道如何将内容添加到网格窗格中。我希望发生的事情是,比如说一组按钮,以完全填充网格窗格占据的区域。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 2015-03-08
      • 2020-03-01
      • 1970-01-01
      • 2018-08-12
      • 2015-03-07
      相关资源
      最近更新 更多