JavaFX API具有将UI控件显示到场景图上的布局类。
HBox布局类将JavaFX子节点放在水平行中。 新的子节点附加到右侧的末尾。默认情况下,HBox布局尊重子节点的首选宽度和高度。
当父节点不可调整大小时,例如Group节点,HBox的行高度设置为子节点的最大首选高度。
默认情况下,每个子节点与左上(Pos.TOP_LEFT)位置对齐。
我们可以通过编程方式改变HBox的布局约束,例如边框,填充,边距,间距和对齐
当处理不可缩放的子节点(如Shape节点)时,父节点会考虑Shape的矩形边界(ParentInBounds)的宽度和高度。
当处理诸如TextField控件之类可调整大小的节点时,父节点计算TextField水平增长的可用空间。
要在HBox中水平增长UI控件,请使用静态HBox.setHgrow()方法。

边框,填充,边距,间距和对齐

image.png
边框
边框样式:
1. border-style边框样式(hidden隐藏、none无边框、dotted电线、dashed虚线、soild实线、double两个边框、groove3D沟槽边框、ridge3D脊边框、inset3D嵌入边框、outset3D突出边框):可以单独设置一边的样式。
border-top-style、border-bottom-style、border-right-style、border-left-style。

缩写:
① border-style: 上 右 下 左;
②border-style: 上 左右 下;
③border-style: 上下 左右;
④border-style: 上下左右;

  1. border-width边框宽度(5px、medium):可以单独设置一边的宽度。
    border-top-width上边框、border-bottom-width下边框、border-right-width有边框、border-left-width左边框。

  2. border-color边框颜色: 可以单独设置一边的颜色。
    border-top-color、border-bottom-color、border-right-color、border-left-color

缩写:
①border: 5px solid red;
②border-top:5px solid red ;
③border-bottom:5px solid red ;
④border-right:5px solid red ;
⑤border-left:5px solid red ;

轮廓
轮廓样式:轮廓是在边框外面的一层,其用法同边框。

outline-style
outline-color
outline-width
缩写:outline:green dotted thick ;

边距
边距:(百分数、em、px)
margin-top
margin-bottom
margin-right
margin-left
缩写:margin: 上 右 下 左;

填充
填充:(百分数、em、px)
padding-top
padding-bottom
padding-left
padding-right
缩写:padding: 上 右 下 左;

尺寸
尺寸:(百分数、em、px)
包括height、width
height、max-height、min-height
width、max-width、min-width

HBox:每个子节点之间的水平间距

  1. package com.javafx03;
  2. import javafx.application.Application;
  3. import javafx.geometry.Insets;
  4. import javafx.scene.Group;
  5. import javafx.scene.Scene;
  6. import javafx.scene.control.Button;
  7. import javafx.scene.layout.HBox;
  8. import javafx.scene.shape.Rectangle;
  9. import javafx.stage.Stage;
  10. public class JavaFx05 extends Application {
  11. @Override
  12. public void start(Stage stage) throws Exception {
  13. //每个子节点之间的水平间距25
  14. HBox hbox = new HBox(25);
  15. Scene scene = new Scene(hbox, 300, 250);
  16. Button b1 = new Button("按钮1");
  17. Button b2 = new Button("按钮2");
  18. Button b3 = new Button("按钮3");
  19. hbox.getChildren().addAll(b1,b2,b3);
  20. stage.setScene(scene);
  21. stage.show();
  22. }
  23. public static void main(String[] args) {
  24. launch(args);
  25. }
  26. }


水平增长

以下代码将TextField控件设置为在调整父HBox的宽度时水平增长:

  1. TextField myTextField = new TextField();
  2. HBox.setHgrow(myTextField, Priority.ALWAYS);

请阅读下面的完整源代码。

  1. import javafx.application.Application;
  2. import javafx.scene.Scene;
  3. import javafx.scene.control.TextField;
  4. import javafx.scene.layout.HBox;
  5. import javafx.scene.layout.Priority;
  6. import javafx.scene.paint.Color;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. @Override
  10. public void start(Stage stage) {
  11. TextField myTextField = new TextField();
  12. HBox hbox = new HBox();
  13. hbox.getChildren().add(myTextField);
  14. //设置之后父节点增长 也跟着增长
  15. HBox.setHgrow(myTextField, Priority.ALWAYS);
  16. Scene scene = new Scene(hbox, 320, 112, Color.rgb(0, 0, 0, 0));
  17. stage.setScene(scene);
  18. stage.show();
  19. }
  20. public static void main(String[] args) {
  21. launch(args);
  22. }
  23. }

image.png

Insets 设置偏移量

以下代码向HBox添加了四个矩形,设置了HBox约束,并演示了HBox布局控件的许多间距属性。矩形节点不可调整大小。

  1. import javafx.application.Application;
  2. import javafx.geometry.Insets;
  3. import javafx.scene.Group;
  4. import javafx.scene.Scene;
  5. import javafx.scene.layout.HBox;
  6. import javafx.scene.shape.Rectangle;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. @Override
  10. public void start(Stage stage) {
  11. Group root = new Group();
  12. Scene scene = new Scene(root, 300, 250);
  13. //HBox内部控件之间的间隔
  14. HBox hbox = new HBox(5);
  15. //new Insets(1):距离边框上下左右距离
  16. hbox.setPadding(new Insets(1));
  17. Rectangle r1 = new Rectangle(10, 10);
  18. Rectangle r2 = new Rectangle(20, 100);
  19. Rectangle r3 = new Rectangle(50, 20);
  20. Rectangle r4 = new Rectangle(20, 50);
  21. //构造一个具有四个不同偏移量的新 Insets 实例。
  22. // @param top 上偏移
  23. // @param right 右偏移
  24. // @param bottom 下偏移
  25. // @param left 左偏移
  26. HBox.setMargin(r1, new Insets(2, 2, 2, 2));
  27. hbox.getChildren().addAll(r1, r2, r3, r4);
  28. root.getChildren().add(hbox);
  29. stage.setScene(scene);
  30. stage.show();
  31. }
  32. public static void main(String[] args) {
  33. launch(args);
  34. }
  35. }

在HBox中增长

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.layout.HBox;
  6. import javafx.scene.layout.Priority;
  7. import javafx.scene.paint.Color;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. Application.launch(args);
  12. }
  13. @Override
  14. public void start(Stage primaryStage) {
  15. primaryStage.setTitle("");
  16. Group root = new Group();
  17. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  18. HBox hbox = new HBox();
  19. Button button1 = new Button("Add ");
  20. Button button2 = new Button("Remove ");
  21. HBox.setHgrow(button1, Priority.ALWAYS);
  22. HBox.setHgrow(button2, Priority.ALWAYS);
  23. button1.setMaxWidth(Double.MAX_VALUE);
  24. button2.setMaxWidth(Double.MAX_VALUE);
  25. hbox.getChildren().addAll(button1, button2);
  26. root.getChildren().add(hbox);
  27. primaryStage.setScene(scene);
  28. primaryStage.show();
  29. }
  30. }

image.png

设置HBox宽度

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.layout.HBox;
  6. import javafx.scene.layout.Priority;
  7. import javafx.scene.paint.Color;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. Application.launch(args);
  12. }
  13. @Override
  14. public void start(Stage primaryStage) {
  15. primaryStage.setTitle("");
  16. Group root = new Group();
  17. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  18. HBox hbox = new HBox();
  19. Button button1 = new Button("Add ");
  20. Button button2 = new Button("Remove ");
  21. HBox.setHgrow(button1, Priority.ALWAYS);
  22. HBox.setHgrow(button2, Priority.ALWAYS);
  23. button1.setMaxWidth(Double.MAX_VALUE);
  24. button2.setMaxWidth(Double.MAX_VALUE);
  25. hbox.getChildren().addAll(button1, button2);
  26. hbox.setPrefWidth(400);
  27. root.getChildren().add(hbox);
  28. primaryStage.setScene(scene);
  29. primaryStage.show();
  30. }
  31. }

image.png

在HBox的控件之间设置空格(空间)

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.layout.HBox;
  6. import javafx.scene.layout.Priority;
  7. import javafx.scene.paint.Color;
  8. import javafx.stage.Stage;
  9. public class Main extends Application {
  10. public static void main(String[] args) {
  11. Application.launch(args);
  12. }
  13. @Override
  14. public void start(Stage primaryStage) {
  15. primaryStage.setTitle("");
  16. Group root = new Group();
  17. Scene scene = new Scene(root, 300, 250, Color.WHITE);
  18. //设置内部元素之间的空格
  19. HBox hbox = new HBox(8);// space
  20. Button button1 = new Button("Add ");
  21. Button button2 = new Button("Remove ");
  22. HBox.setHgrow(button1, Priority.ALWAYS);
  23. HBox.setHgrow(button2, Priority.ALWAYS);
  24. button1.setMaxWidth(Double.MAX_VALUE);
  25. button2.setMaxWidth(Double.MAX_VALUE);
  26. hbox.getChildren().addAll(button1, button2);
  27. hbox.setPrefWidth(400);
  28. root.getChildren().add(hbox);
  29. primaryStage.setScene(scene);
  30. primaryStage.show();
  31. }
  32. }

HBox设置填充和间距

  1. import javafx.application.Application;
  2. import javafx.geometry.Insets;
  3. import javafx.scene.Scene;
  4. import javafx.scene.control.Button;
  5. import javafx.scene.layout.HBox;
  6. import javafx.stage.Stage;
  7. public class Main extends Application {
  8. public static void main(String[] args) {
  9. Application.launch(args);
  10. }
  11. @Override
  12. public void start(Stage primaryStage) {
  13. primaryStage.setTitle("HBox Test");
  14. // HBox
  15. HBox hb = new HBox();
  16. //填充
  17. hb.setPadding(new Insets(150, 12, 15, 12));
  18. hb.setSpacing(10);
  19. // Buttons
  20. Button btn1 = new Button();
  21. btn1.setText("Button1");
  22. hb.getChildren().add(btn1);
  23. Button btn2 = new Button();
  24. btn2.setText("Button2");
  25. hb.getChildren().add(btn2);
  26. Button btn3 = new Button();
  27. btn3.setText("Button3");
  28. hb.getChildren().add(btn3);
  29. Button btn4 = new Button();
  30. btn4.setText("Button4");
  31. hb.getChildren().add(btn4);
  32. // Adding HBox to the scene
  33. Scene scene = new Scene(hb);
  34. primaryStage.setScene(scene);
  35. primaryStage.show();
  36. }
  37. }

image.png