перенос содержимого в JavaFX

#java #javafx

#java #javafx-8

Вопрос:

 package example;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Text text = new Text("This is a Text");

        VBox box = new VBox();
        box.setAlignment(Pos.CENTER);
        box.setStyle("-fx-background-color: yellow;");
        box.getChildren().add(text);

        StackPane container = new StackPane();
        container.getChildren().add(box);

        BorderPane bp = new BorderPane();
        bp.setCenter(container);

        Scene scene = new Scene(bp, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}
  

Вот результат:

Вывод приведенного выше кода

Вопрос: Может кто-нибудь объяснить мне, почему Vbox заполняет весь экран? Существует ли метод, аналогичный wrap_content для Android? Я хочу, чтобы изображение ниже было выводом:

введите описание изображения здесь

Ответ №1:

Решение

Оберните VBox в группу; например, используйте:

 container.getChildren().add(new Group(box));
  

вместо:

 container.getChildren().add(box);
  

Почему это работает

Из группы javadoc:

По умолчанию группа будет «автоматически изменять размер» своих управляемых дочерних элементов с изменяемым размером до их предпочтительных размеров во время прохода компоновки.

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

Альтернативная реализация

Установите максимальный размер VBox на предпочтительный размер. Тогда VBox будет только когда-либо увеличиваться достаточно, чтобы соответствовать предпочтительному размеру содержимого внутри него, и никогда не будет увеличиваться.

 box.setMaxSize(VBox.USE_PREF_SIZE, VBox.USE_PREF_SIZE);
  

Почему VBox растет по умолчанию

Это контейнер с изменяемым размером, который будет растягиваться, чтобы заполнить доступную область.

Примечание

Я не знаю, что эффект точно такой же, как у метода Android wrap_content, поскольку я никогда не разрабатывал для Android, однако эффект, похоже, точно соответствует второму изображению, которое вы указали в своем вопросе, и, похоже, это то, что вы хотите.

Комментарии:

1. Мне кажется, что это точно такое же поведение. (Я явно ищу «перенос содержимого javafx», так как я знал поведение Android.) Кстати, ты спас мне день;)

Ответ №2:

VBox автоматически изменяет размер до размера родительского файла, поэтому лучше не устанавливать для него цвет фона. Вместо этого вы можете использовать a Label вместо a Text , а затем добавить цвет фона к метке вместо VBox .

 public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label text = new Label("This is a Text");

        VBox box = new VBox();
        box.setAlignment(Pos.CENTER);
        text.setStyle("-fx-background-color: yellow;");
        box.getChildren().add(text);

        StackPane container = new StackPane();
        container.getChildren().add(box);

        BorderPane bp = new BorderPane();
        bp.setCenter(container);

        Scene scene = new Scene(bp, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}
  

Это даст вам результат, подобный изображению ниже:

введите описание изображения здесь