我尝试简单的测试

package sample;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane pane = new BorderPane();
        pane.setBackground(new Background(new BackgroundFill(Color.RED, CornerRadii.EMPTY, Insets.EMPTY)));
        HBox hBox = new HBox();
        hBox.setBackground(new Background(new BackgroundFill(Color.GREEN, CornerRadii.EMPTY, Insets.EMPTY)));
        hBox.setPrefHeight(100);
        hBox.setPrefWidth(100);
        pane.getChildren().add(hBox);
        primaryStage.setScene(new Scene(pane, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}


预期在红色窗格上看到绿色正方形HBox,但仅看到红色窗格。
但是,如果我直接将HBox用作根视图(将其传递到new Scene()),则可以看到绿色框。

为什么Pane内缺少HBox?

最佳答案

您正在使用BorderPane作为根窗格,并使用以下命令将HBox添加到它

pane.getChildren().add(hBox);


BorderPane是一个布局窗格,它以特定方式管理其子节点的位置和大小。共有五个区域,子节点的大小和位置不仅取决于子节点的minprefmax大小,而且还取决于为其分配子区域。

就您发布的代码而言,由于您根本没有分配区域,因此HBox的大小为零。

如果将HBox放在其他区域,则会得到不同的(但不一定是所需的)行为。如果将HBox放在左侧或右侧,则会为HBox分配其首选宽度,但其高度将是边框窗格的整个高度。相反,如果将其放置在顶部或底部,则会为其指定首选高度,但会拉伸边框窗格的整个宽度。 (如果将其放在中间,它将拉伸边框窗格的整个宽度和高度。)

您可能(取决于您要查找的确切行为)仅在此处需要一个普通窗格:

Pane pane = new Pane();

09-10 07:46
查看更多