Class 如何在JavaFx中使用GridPane对齐一行中的四个按钮

Class 如何在JavaFx中使用GridPane对齐一行中的四个按钮,class,button,javafx,alignment,gridpane,Class,Button,Javafx,Alignment,Gridpane,我有一个中心对齐的网格窗格,但网格窗格中的四个按钮之间有间隙。如何摆脱这个? 我所做的是 GridPane grid= new GridPane(); grid.setAlignment(Pos.CENTER); grid.setVgap(5); grid.setHgap(5); grid.add(label1, 0, 0); grid.add(tf1, 1, 0); grid.add(label2, 0, 1); grid

我有一个中心对齐的网格窗格,但网格窗格中的四个按钮之间有间隙。如何摆脱这个? 我所做的是

GridPane grid= new GridPane();
   
   grid.setAlignment(Pos.CENTER); 
    grid.setVgap(5); 
    grid.setHgap(5);
    grid.add(label1, 0, 0); 
  grid.add(tf1, 1, 0); 
  grid.add(label2, 0, 1);       
  grid.add(tf2, 1, 1); 
  grid.add(btn1,0,2);
  grid.add(btn2,1,2);
  grid.add(btn3,2,2);
  grid.add(btn4,3,2);
  //Setting size of scene 
   Scene scene = new Scene(grid, 370, 170);      
    primaryStage.setScene(scene);
    primaryStage.show();
按钮显示为:


两个按钮后有一个间隙。如何消除这一差距?

试试这段代码。我相信这个小补丁就可以了

grid.add(btn1,0,2);
grid.add(btn2,1,2);
grid.add(btn3,2,2);
grid.add(btn4,3,2);

默认情况下,在
网格窗格中,每一列的大小均为最宽元素的首选宽度(同样,每一行的大小均为最高元素的首选高度)。由于第二个按钮与文本字段位于同一列中,默认情况下文本字段比按钮宽,因此该列的宽度将由文本字段的宽度决定

如何解决这一问题取决于您想要的实际行为。如果确实希望第二个按钮与文本字段位于同一列中,可以通过使按钮增长到该列的全宽来消除间隙:

public class GridPaneTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        
        Label label1 = new Label("Label 1");
        Label label2 = new Label("Label 2");
        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        Button btn1 = new Button("Button 1");
        Button btn2 = new Button("Button 2");
        Button btn3 = new Button("Button 3");
        Button btn4 = new Button("Button 4");
        
        grid.setAlignment(Pos.CENTER);
        grid.setVgap(5);
        grid.setHgap(5);
        grid.add(label1, 0, 0);
        grid.add(tf1, 1, 0);
        grid.add(label2, 0, 1);
        grid.add(tf2, 1, 1);
        grid.add(btn1, 0, 2);
        grid.add(btn2, 1, 2);
        btn2.setMaxWidth(Double.POSITIVE_INFINITY);
        GridPane.setFillWidth(btn2, true);
        grid.add(btn3, 2, 2);
        grid.add(btn4, 3, 2);
        // Setting size of scene
        Scene scene = new Scene(grid, 370, 170);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}

或者通过减小文本字段的首选大小(因此列的宽度由按钮决定):

或者,您可以使文本字段填充按钮2-4占用的所有三列(使用采用列和行跨度以及索引的
add
方法版本):

注意,在最后一个版本中,包含标签的单元格的宽度与包含第一个按钮的单元格的宽度相同,这可能也不是您想要的。最好的方法可能是将按钮放在
HBox
中,并让该
HBox
覆盖网格窗格的整个宽度(现在只有两列):


通过将按钮添加到(0,2)(1,2)(3!、2)和(4,2),可以专门设置按钮,使其之间有一个单元格。第三个按钮应添加到(2,2),第四个按钮应添加到(3,2)。您的
btn2
与两个文本字段位于同一列中。由于文本字段的默认大小大于按钮的默认大小,因此按钮占用的网格单元格中必然有额外的空间。您需要更精确地指定如何处理这种情况。如果您不希望按钮符合网格,例如,将它们放在
HBox
中,并将该
HBox
添加到第2行,列跨度为4。如果你真的希望他们在网格中,你不清楚你希望他们表现如何?使btn2变大?让文本字段变小?@Robert注意到这实际上没有任何区别,尽管有一个空白列是很奇怪的。第2列的宽度为零。@James_D你能给我一个代码让它看起来很好吗?你可以添加一个简短的错误解释,这样以后的读者就不必逐行比较:)这不会有任何区别。默认情况下,空列的宽度为零。
public class GridPaneTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        
        Label label1 = new Label("Label 1");
        Label label2 = new Label("Label 2");
        TextField tf1 = new TextField();
        tf1.setPrefColumnCount(0);
        TextField tf2 = new TextField();
        tf2.setPrefColumnCount(0);
        Button btn1 = new Button("Button 1");
        Button btn2 = new Button("Button 2");
        Button btn3 = new Button("Button 3");
        Button btn4 = new Button("Button 4");
        
        HBox buttons = new HBox(5, btn1, btn2, btn3, btn4);

        grid.setAlignment(Pos.CENTER);
        grid.setVgap(5);
        grid.setHgap(5);
        grid.add(label1, 0, 0);
        grid.add(tf1, 1, 0);
        grid.add(label2, 0, 1);
        grid.add(tf2, 1, 1);
        grid.add(btn1, 0, 2);
        grid.add(btn2, 1, 2);
        grid.add(btn3, 2, 2);
        grid.add(btn4, 3, 2);
        // Setting size of scene
        Scene scene = new Scene(grid, 370, 170);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}
public class GridPaneTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        
        Label label1 = new Label("Label 1");
        Label label2 = new Label("Label 2");
        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        Button btn1 = new Button("Button 1");
        Button btn2 = new Button("Button 2");
        Button btn3 = new Button("Button 3");
        Button btn4 = new Button("Button 4");
        

        grid.setAlignment(Pos.CENTER);
        grid.setVgap(5);
        grid.setHgap(5);
        grid.add(label1, 0, 0);
        grid.add(tf1, 1, 0, 3, 1);
        grid.add(label2, 0, 1);
        grid.add(tf2, 1, 1, 3, 1);
        grid.add(btn1, 0, 2);
        grid.add(btn2, 1, 2);
        grid.add(btn3, 2, 2);
        grid.add(btn4, 3, 2);
        // Setting size of scene
        Scene scene = new Scene(grid, 370, 170);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}
public class GridPaneTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        
        Label label1 = new Label("Label 1");
        Label label2 = new Label("Label 2");
        TextField tf1 = new TextField();
        TextField tf2 = new TextField();
        Button btn1 = new Button("Button 1");
        Button btn2 = new Button("Button 2");
        Button btn3 = new Button("Button 3");
        Button btn4 = new Button("Button 4");
        
        HBox buttons = new HBox(5, btn1, btn2, btn3, btn4);

        grid.setAlignment(Pos.CENTER);
        grid.setVgap(5);
        grid.setHgap(5);
        grid.add(label1, 0, 0);
        grid.add(tf1, 1, 0);
        grid.add(label2, 0, 1);
        grid.add(tf2, 1, 1);
        grid.add(buttons, 0, 2, 2, 1);
        // Setting size of scene
        Scene scene = new Scene(grid, 370, 170);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}