VBox

Последнее обновление: 07.06.2018

Контейнер организует вложенные элементы в виде вертикального ряда.

Для создания объекта VBox применяется один из следующих конструкторов:

  • VBox(): определяет пустой объект VBox

  • VBox​(double spacing): определяет пустой объект VBox, элементы которого будут находиться друг от друга на расстоянии spacing. По умолчанию это значение равно 0

  • VBox​(double spacing, Node... children): определяет объект VBox, заполненный элементами nodes, которые находятся друг от друга на расстоянии spacing

  • VBox​(Node... children): определяет объект VBox, заполненный элементами nodes

Определим простой VBox:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;

public class Main extends Application{
	
	public static void main(String[] args) {
        
		Application.launch(args);
    }
	
	@Override
    public void start(Stage stage) {
		
		Label label1 = new Label("Label1");
		Label label2 = new Label("Label2");
		Label label3 = new Label("Label3");
		Label label4 = new Label("Label4");
		Label label5 = new Label("Label5");
		Label label6 = new Label("Label6");
		Label label7 = new Label("Label7");
		
		VBox root = new VBox(10, label1, label2, label3, label4, label5, label6, label7);
		Scene scene = new Scene(root, 300, 150);
		stage.setScene(scene);
		
        stage.setTitle("VBox in JavaFX");
		
        stage.show();
	}
}

Если места для элементов не хватает, но они не переносятся на другой ряд.

VBox в JavaFX

Некоторые из методов VBox:

  • getAlignment(): получает выравнивание внутри FlowPane в виде объекта Pos

  • setAlignment​(Pos value): задает выравнивание

  • getSpacing(): возвращает расстояние между элементами

  • setSpacing​(double value): устанавливает расстояние между элементами

  • VBox.getVgrow​(Node child): статический метод возвращает для элемента child ограничение vgrow в виде объекта Priority

  • VBox.setVgrow​(Node child, Priority value): статический метод устанавливает для элемента child ограничение vgrow

  • setFillWidth​(boolean value): при передачи значения true расширяет VBox по всей ширине контейнера

  • isFillWidth(): возвращает логическое значение true или false, которое указывает, развернут ли VBox по всей ширине контейнера

  • VBox.setMargin​(Node child, Insets value): статический метод устанавливает для элемента child внешние отступы от границ контейнера

  • VBox.getMargin​(Node child): статический метод получает внешние отступы элемента от границ контейнера

Особо выделим метод VBox.setVgrow​(), который позволяет установить для элемента ограничение vgrow. Это ограничение представляет класс javafx.scene.layout.Priority и позволяет указать, как будет растягиваться вложенный элемент.

Например, растянем кнопку по всей высоте контейнера:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Priority;

public class Main extends Application{
	
	public static void main(String[] args) {
        
		Application.launch(args);
    }
	
	@Override
    public void start(Stage stage) {
		
		Button btn = new Button("Hello");
		VBox vbox = new VBox();
		VBox.setVgrow(btn, Priority.ALWAYS);
		btn.setMaxHeight(Double.MAX_VALUE);
		vbox.getChildren().addAll(btn);
		
		Scene scene = new Scene(vbox, 300, 150);
		stage.setScene(scene);
		
        stage.setTitle("VBox in JavaFX");
		
        stage.show();
	}
}

Для кнопки с помощью setMaxHeight задается максимальная высота, которая принимает максимально допустимое значение для типа double. А в качестве ограничения устанавливается значение Priority.ALWAYS, которое поволяет автоматически масштабировать кнопку, чтобы заполнить пространство контейнера.

vgrow в VBox в JavaFX

Подобным образом мы можем растягивать несколько элементов или комбинировать их с элементами, которое не должны растягиваться:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Priority;

public class Main extends Application{
	
	public static void main(String[] args) {
        
		Application.launch(args);
    }
	
	@Override
    public void start(Stage stage) {
		
		Button okBtn = new Button("OK");
		Button cancelBtn = new Button("Cancel");
		Label lbl = new Label("Select");
		
		VBox vbox = new VBox(15);

		VBox.setVgrow(okBtn, Priority.ALWAYS);
		okBtn.setMaxHeight(Double.MAX_VALUE);
		//okBtn.setMaxWidth(100);
		
		VBox.setVgrow(cancelBtn, Priority.ALWAYS);
		cancelBtn.setMaxHeight(Double.MAX_VALUE);
		//cancelBtn.setMaxWidth(100);
		
		vbox.getChildren().addAll(lbl, okBtn, cancelBtn);
		
		Scene scene = new Scene(vbox, 300, 150);
		stage.setScene(scene);
		
        stage.setTitle("VBox in JavaFX");
		
        stage.show();
	}
}

Две кнопки будут заполнять равномерно пространство VBox, тогда как метка label занимает только то место, которое ей необходимо.

Однако при использовании VBox, как видно из скриншота, мы можем столкнуться с проблемой неравномерной ширины элементов. Элементы автоматически нерятягиваются по всей ширине контейнера. Чтобы выйти из этой проблемы, мы можем задать максимальную ширину для элементов:

okBtn.setMaxWidth(100);
cancelBtn.setMaxWidth(100);

// растяжение по всей ширине VBox
// okBtn.setMaxWidth(Double.MAX_VALUE);
// cancelBtn.setMaxWidth(Double.MAX_VALUE);
Равномерное растяжение в VBox в JavaFX
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850