Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JavaFX包装内容_Java_Javafx 8 - Fatal编程技术网

用JavaFX包装内容

用JavaFX包装内容,java,javafx-8,Java,Javafx 8,以下是输出: 问题:有人能给我解释一下为什么Vbox会占据整个屏幕吗?有没有一种方法类似于Android的wrap_内容?我希望下面的图像作为输出: VBox会自动根据父对象的大小调整自身大小,因此最好不要为其设置背景色。相反,您可以使用标签代替文本,然后向标签添加背景色,而不是VBox package example; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene

以下是输出:

问题:有人能给我解释一下为什么Vbox会占据整个屏幕吗?有没有一种方法类似于Android的wrap_内容?我希望下面的图像作为输出:


VBox
会自动根据父对象的大小调整自身大小,因此最好不要为其设置背景色。相反,您可以使用
标签
代替
文本
,然后向标签添加背景色,而不是
VBox

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包在一个容器中;e、 g.使用:

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);
    }
}
而不是:

container.getChildren().add(new Group(box));
为什么有效

从组javadoc:

默认情况下,组将在布局过程中将其托管的可调整大小的子级“自动调整大小”为其首选大小

这意味着VBox不会超过其内容的首选大小(该大小刚好足以显示其中的标签)

替代实施

将VBox的最大大小设置为首选大小。然后,VBox只会变得足够大,以适应其内部内容的首选大小,并且永远不会变得更大

container.getChildren().add(box);
为什么VBox默认增长

这是一个将延伸以填充可用区域的区域


我不知道它的效果是否与我从未为Android开发过的Android wrap_内容方法完全相同,但是它的效果似乎与您在问题中提供的第二张图像完全匹配,这似乎是您想要的。

对我来说,这似乎是完全相同的行为。(我明确搜索“wrap content javafx”,因为我知道android的行为。)顺便说一句,你救了我一天;)
box.setMaxSize(VBox.USE_PREF_SIZE, VBox.USE_PREF_SIZE);