为什么我的背景颜色超出了 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
的大小并确保它不会超出您为其设置的最大大小。
为了确保您的 maxWidth
和 maxHeight
得到尊重,您需要将网格窗格放置在将执行布局的布局窗格中,并注意这些属性。所以你可以这样做:
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 解决方案的行为与第一个解决方案不同,因此它们并不等同。
我的场景是:
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
的大小并确保它不会超出您为其设置的最大大小。
为了确保您的 maxWidth
和 maxHeight
得到尊重,您需要将网格窗格放置在将执行布局的布局窗格中,并注意这些属性。所以你可以这样做:
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 解决方案的行为与第一个解决方案不同,因此它们并不等同。