为什么我的背景颜色超出了 Javafx FXML 应用程序中节点的大小?

Why does my background color go beyond the size of node in Javafx FXML application?

我的场景是:

Scene scene = new Scene(root, 320, 220);

在 FXML 中,网格窗格是:

<GridPane fx:id="base"
      alignment="CENTER"
      maxHeight="200.0"
      maxWidth="300.0"
      stylesheets="@style.css"
      vgap="0" xmlns="http://javafx.com/javafx/8"
      xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="sample.Controller">
...

CSS 网格窗格:

-fx-background-color: red;

尽管我的网格窗格的最大高度和宽度分别为 200 和 300,但背景超出了覆盖整个场景的范围。我将背景设为红色以使其明显。 Picture here

有人能解释一下吗?以及如何将背景仅限于网格而不是整个场景?

您检查 css 是否已将背景颜色应用于网格窗格或场景。 或者您可以通过代码本身将背景颜色应用于 gridPane,如下所示。 试试这个..

gridPane.setStyle("-fx-background-color:red");

A Scene 无布局可言。 Scene 的根将填充 Scene 的维度,而不管已设置的任何最大(或最小)大小。所以这里发生的并不是 "background color is going beyond the size of the node" 节点正在填充场景(并且尺寸大于您设置的最大尺寸)。基本上,没有任何东西可以管理 GridPane 的大小并确保它不会超出您为其设置的最大大小。

为了确保您的 maxWidthmaxHeight 得到尊重,您需要将网格窗格放置在将执行布局的布局窗格中,并注意这些属性。所以你可以这样做:

Scene scene = new Scene(new StackPane(root), 320, 220);

这会将 GridPane (root) 放在 StackPane 中。 StackPane 管理 root 的布局并确保它不会超出您设置的最大尺寸。

如果您愿意,您当然可以在 FXML 中包含 StackPane(或您选择管理 GridPane 的任何内容)。

也许 off-topic,但如果您希望网格窗格与其周围的任何东西之间有间隙,您可以考虑纯粹在 CSS:

中执行此操作
#base {
    -fx-background-color: transparent, red ;
    -fx-background-insets: 0, 10 ;
    -fx-padding: 10 ;
}

然后您可以将网格窗格直接添加到场景中,并且(当它仍然充满场景时)它的边缘周围有一个 10 像素的透明边框。

请注意,当您调整 window 大小时,CSS 解决方案的行为与第一个解决方案不同,因此它们并不等同。