在JavaFX中包装内容

时间:2015-04-08 01:58:32

标签: 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);
    }

}

这是输出:

The output of the above code

问题:有人可以向我解释为什么Vbox会填满整个屏幕吗?有没有类似于Android的wrap_content的方法?我希望下面的图像是输出:

enter image description here

2 个答案:

答案 0 :(得分:4)

解决方案

将VBox包裹在Group中;例如使用方法:

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默认增长

这是一个resizable container,可以伸展以填充可用区域。

注意

我不知道效果与我从未为Android开发的Android wrap_content方法完全相同,但效果似乎与您在问题中提供的第二张图片完全匹配,是你想要的。

答案 1 :(得分:2)

VBox自动调整自身大小为父级的大小,因此最好不要为其设置背景颜色。相反,您可以使用Label代替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);
    }
}

这将为您提供如下图像的输出:

enter image description here