Если вам нужен обзор всех различных панелей макетов в JavaFX 2.0 или если вы хотите узнать основные факты о них, см. Мой предыдущий пост Панели макетов в JavaFX 2.0 .
HBox макетов HBox и VBox , безусловно, являются самыми простыми контейнерами макетов в JavaFX 2.0. Как вы уже можете сказать по их имени, их целью является размещение всех их дочерних HBox в одном горизонтальном ряду ( HBox ) или в одном вертикальном столбце ( VBox ). Поскольку они очень просты в использовании и очень полезны при незначительных проблемах с макетом, вы, вероятно, будете их часто использовать. Я приведу два примера, как вы можете их использовать. Как и в других примерах, сначала код, а затем пояснения. HBox и VBox — Пример 1
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import javafx.application.Application;import javafx.geometry.Pos;import javafx.scene.Scene;import javafx.scene.control.Button;import javafx.scene.layout.HBox;import javafx.scene.layout.VBox;import javafx.stage.Stage;/** * * Created on: 20.03.2012 * @author Sebastian Damm */public class HBoxandVBoxExample extends Application{ @Override public void start(Stage primaryStage) throws Exception { HBox hbox = new HBox(50); hbox.setAlignment(Pos.CENTER); // default TOP_LEFT VBox vbox1 = new VBox(); vbox1.setAlignment(Pos.BOTTOM_CENTER); vbox1.setStyle("-fx-border-style: solid;" + "-fx-border-width: 1;" + "-fx-border-color: black"); VBox vbox2 = new VBox(10); vbox2.setAlignment(Pos.CENTER); vbox2.setStyle("-fx-border-style: solid;" + "-fx-border-width: 1;" + "-fx-border-color: black"); VBox vbox3 = new VBox(20); vbox3.setAlignment(Pos.TOP_CENTER); vbox3.setStyle("-fx-border-style: solid;" + "-fx-border-width: 1;" + "-fx-border-color: black"); for (int i = 0; i < 5; i++) { Button bt = new Button("Button " + (i+1)); Button bt2 = new Button("Button " + (i+1)); // unfortunately there´s no "clone" or "copy" method Button bt3 = new Button("Button " + (i+1)); vbox1.getChildren().add(bt); vbox2.getChildren().add(bt2); vbox3.getChildren().add(bt3); } hbox.getChildren().addAll(vbox1, vbox2, vbox3); Scene scene = new Scene(hbox, 350, 250); // the hbox is the root node primaryStage.setTitle("HBox and VBox Example"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { Application.launch(args); }} |
По сути, мы создаем три разных VBox и помещаем их в один HBox. В обоих классах вы можете определить значение интервала либо непосредственно в конструкторе, либо с помощью метода
setSpacing . Это значение будет использоваться в качестве разрыва между отдельными дочерними элементами на панели. Линия HBox hbox = new HBox(50); поэтому создает HBox для хранения трех VBox с промежутком в 50 пикселей между каждым из них. Мы используем метод
setAlignment чтобы указать, как отдельные VBox-ы должны расположить и расположить всех своих детей. С помощью
setStyle вы можете применять собственные стили CSS к любому Node . Я не хочу вдаваться в подробности, потому что я расскажу о стилях CSS в JavaFX 2.0 в одной из моих следующих публикаций, но если вы уже знакомы с CSS, вы, вероятно, уже заметили, что команда JavaFX 2.0 К счастью, решил очень точно следовать стандартам CSS, определенным W3C ( http://www.w3.org ). Если вы не знакомы с CSS, вам просто нужно знать, что эти строки CSS создают черную рамку шириной 1px вокруг компонента. Я использую их здесь, чтобы показать вам размер отдельных VBox. Следующие несколько строк должны быть довольно обычными для вас: мы создаем пять кнопок для каждого VBox, помещаем различные VBox в наш HBox, объявляем объект
Scene (с HBox качестве root) и показываем наше приложение. Ваше приложение должно выглядеть так:
Вы можете видеть, что каждый
VBox размещает свои дочерние кнопки с определенным значением интервала, а HBox три VBox с промежутком в 50 пикселей. Поскольку мы устанавливаем различное выравнивание для каждого VBox вы можете видеть, что они располагают кнопки внутри своих границ определенным образом. Примечание. Мы также указали выравнивание для
HBox , иначе три VBox не были бы размещены в центре! Если вы измените размер окна вашего приложения, оно должно выглядеть так:
Вы можете видеть, что VBox’ы растут и заполняют пространство, предоставленное их родителями, и что они все еще размещают своих детей в соответствии с их выравниванием набора.
HBox и VBox — Пример 2
Следующий пример покажет, как использовать статические
setMargin и setHgrow (соответственно setVgrow ): |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import javafx.application.Application;import javafx.geometry.Insets;import javafx.scene.Scene;import javafx.scene.control.*;import javafx.scene.layout.*;import javafx.stage.Stage;/** * * Created on: 20.03.2012 * @author Sebastian Damm */public class HBoxandVBoxExample2 extends Application{ @Override public void start(Stage primaryStage) throws Exception { StackPane root = new StackPane(); HBox hbox = new HBox(30); // create a HBox to hold 2 vboxes // create a vbox with a textarea that grows vertically VBox vbox = new VBox(10); Label lbName = new Label("I´m a label!"); TextField textField = new TextField(); TextArea textArea = new TextArea(); textArea.setPrefWidth(100); VBox.setVgrow(textArea, Priority.ALWAYS); vbox.getChildren().addAll(lbName, textField, textArea); // create a vbox that grows horizontally inside the hbox VBox vbox2 = new VBox(10); Label lbName2 = new Label("I´m also a label!"); TextField tf2 = new TextField(); tf2.setPromptText("type here"); TextArea textArea2 = new TextArea(); textArea2.setPrefWidth(100); vbox2.getChildren().addAll(lbName2, tf2, textArea2); HBox.setHgrow(vbox2, Priority.ALWAYS); // the next two lines behave equally - try to comment the first line out and use the 2nd line hbox.setPadding(new Insets(20));// StackPane.setMargin(hbox, new Insets(20)); hbox.getChildren().addAll(vbox, vbox2); root.getChildren().add(hbox); Scene scene = new Scene(root, 500, 300); // the stack pane is the root node primaryStage.setTitle("HBox and VBox Example 2"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { Application.launch(args); }} |
В этом примере мы создаем два VBox, которые являются потомками HBox. Внутри VBox есть одна метка, одно текстовое поле и одна текстовая область.
Первая замечательная строка
VBox.setVgrow(textArea, Priority.ALWAYS) . С помощью этой строки мы определяем, что объект TextArea всегда должен расти вертикально, если он содержится в VBox (иначе никаких эффектов не будет). Затем установите фокус на HBox.setHgrow(vbox2, Priority.ALWAYS) . Здесь мы говорим второму VBox расти горизонтально внутри HBox . Наконец с
hbox.setPadding(new Insets(20)); или StackPane.setMargin(hbox, new Insets(20)) мы даем всему HBox некоторый отступ. Эти две строки ведут себя одинаково, потому что с одной стороны мы указываем отступ для самой панели, который должен использоваться панелью внутри ее границ для разметки своих дочерних элементов, а с другой стороны мы говорим родителю расположить панель с заданным поле вокруг него. Примечание: маржа — это внешнее расстояние / разрыв, дополняющий внутреннее.
Вот картинка, показывающая вам «CSS Box Model», которая демонстрирует связь между содержимым, отступом, границей и полем элемента.
Поскольку метод
setPadding определен в классе Region , этот метод можно использовать на любой панели макета. Класс Insets используется для этих целей и предоставляет два разных конструктора: один, который принимает одно двойное значение и определяет одинаковое заполнение для каждой стороны, и один конструктор, который принимает четыре двойных значения и определяет заполнение по часовой стрелке сверху вниз по левой стороне. , Подсказка: если вы примените границу к
HBox и переключитесь между двумя линиями для установки отступов / полей, вы увидите разницу более четко. Ваше приложение должно выглядеть так:

Обратите внимание на отступ в 10 HBox вокруг HBox . Если вы теперь измените размер окна, оно должно выглядеть примерно так:

Как вы можете видеть, TextArea в левом VBox растет вертикально, а весь правый VBox растет горизонтально внутри HBox .
Ссылка: JavaFX 2.0 Layout Panes — HBox и VBox от нашего партнера по JCG Себастьяна Дамма в блоге Just my 2 cents о Java .


