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);
}
}