Java ScrollPane scroll不适用于其他节点

Java ScrollPane scroll不适用于其他节点,java,javafx,Java,Javafx,我想让StackPane作为我的根窗格。我想在场景中间有一个滚动窗格,一个小盒子,两个按钮下面容器。 我试图通过编写以下代码来实现这一点: private StackPane root=new StackPane(); 私有场景=新场景(root,1366768); 公共连续屏幕(){ Button button1=新建ButtonBuilder(“我的button1”).setPrefWidth(200.build(); Button button2=新建ButtonBuilder(“我的bu

我想让StackPane作为我的根窗格。我想在场景中间有一个滚动窗格,一个小盒子,两个按钮<强>下面<强>容器。

我试图通过编写以下代码来实现这一点:

private StackPane root=new StackPane();
私有场景=新场景(root,1366768);
公共连续屏幕(){
Button button1=新建ButtonBuilder(“我的button1”).setPrefWidth(200.build();
Button button2=新建ButtonBuilder(“我的button2”).setPrefWidth(200).build();
Button button3=新建ButtonBuilder(“我的button3”).setPrefWidth(200.build();
Button button4=新建ButtonBuilder(“我的button4”).setPrefWidth(200.build();
Button button5=新建ButtonBuilder(“我的button5”).setPrefWidth(200.build();
Button button6=新建ButtonBuilder(“我的button6”).setPrefWidth(200.build();
VBox VBox=新的VBox(5);
vBox.getChildren().addAll(按钮1、按钮2、按钮3、按钮4、按钮5、按钮6);
ScrollPane ScrollPane=新的ScrollPane();
scrollPane.setContent(vBox);
scrollPane.setPannable(true);
scrollPane.setMaxSize(500180);
scrollPane.setVbarPolicy(scrollPane.ScrollBarPolicy.ALWAYS);
scrollPane.setHbarPolicy(scrollPane.ScrollBarPolicy.AS_所需);
root.getChildren().add(滚动窗格);
StackPane.setAlignment(滚动窗格,位置中心);
}
正如您可能注意到的,代码确实工作得非常好,但直到我添加下面我所说的按钮为止。我在HBox中添加了这些按钮作为

HBox-HBox=新的HBox(5);
hBox.设置校准(位置底部\中心);
hBox.getChildren().addAll(新按钮(“猫”)、新按钮(“狗”);
root.getChildren().addAll(hBox);

现在显示滚动窗格和两个按钮。但是,由于某些原因,滚动窗格现在停止工作。此时将显示滚动窗格及其内容,但水平滚动或垂直滚动都不起作用。有人知道为什么会发生这种情况以及如何修复吗?

当您使用StackPane作为根节点时,它会将节点堆积在一起,因此顶部窗格是HBox而不是ScrollPane,因此您无法使用它

使用BorderPane或VBox并重试

        BorderPane root = new BorderPane();
        Scene scene = new Scene(root, 1366, 768);
        root.setCenter(scrollPane);
        HBox hBox = new HBox(5);
        hBox.getChildren().addAll(new Button("cat"), new Button("dog"));
        root.setBottom(hBox);

当您使用StackPane作为根节点时,它会将节点彼此堆积起来,因此顶部窗格是HBox而不是ScrollPane,因此您无法使用它

使用BorderPane或VBox并重试

        BorderPane root = new BorderPane();
        Scene scene = new Scene(root, 1366, 768);
        root.setCenter(scrollPane);
        HBox hBox = new HBox(5);
        hBox.getChildren().addAll(new Button("cat"), new Button("dog"));
        root.setBottom(hBox);

这里的问题是允许
StackPane
调整
HBox
的大小。
HBox
覆盖了防止鼠标事件到达
滚动窗格的整个场景。通过给HBox上色,您可以很容易地看到这一点:

hBox.setStyle("-fx-background-color: rgba(100%, 0%, 0%, 0.5)");
最简单的解决方案是将
HBox
设置为仅接收非(完全)透明区域上的事件:

hBox.setPickOnBounds(false);
但是,您也可以设置
HBox
,以占用所需的空间,以适合内容的首选大小,并通过
StackPane
进行对齐:

hBox.setPrefSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
hBox.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
StackPane.setAlignment(hBox, Pos.BOTTOM_CENTER);
// hBox.setAlignment(Pos.BOTTOM_CENTER);
请注意,这样使用
StackPane
并不能为您提供响应性GUI:如果将窗口调整到足够小的高度,按钮将覆盖
滚动窗格


使用
BorderPane
或将
StackPane
HBox
包装在
VBox
中,并将
VBox.vgrow
设置为
优先级,您可能会有更好的运气。对于
StackPane

这里的问题是允许
StackPane
调整
HBox的大小,确实如此。
HBox
覆盖了防止鼠标事件到达
滚动窗格的整个场景。通过给HBox上色,您可以很容易地看到这一点:

hBox.setStyle("-fx-background-color: rgba(100%, 0%, 0%, 0.5)");
最简单的解决方案是将
HBox
设置为仅接收非(完全)透明区域上的事件:

hBox.setPickOnBounds(false);
但是,您也可以设置
HBox
,以占用所需的空间,以适合内容的首选大小,并通过
StackPane
进行对齐:

hBox.setPrefSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
hBox.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
StackPane.setAlignment(hBox, Pos.BOTTOM_CENTER);
// hBox.setAlignment(Pos.BOTTOM_CENTER);
请注意,这样使用
StackPane
并不能为您提供响应性GUI:如果将窗口调整到足够小的高度,按钮将覆盖
滚动窗格


使用
BorderPane
或将
StackPane
HBox
包装在
VBox
中,并将
VBox.vgrow
设置为
优先级,您可能会更幸运。对于
StackPane
,请始终使用
,谢谢,但我遇到了一个问题。当我使用BorderPane作为根时,我无法将其居中到我正在谈论的位置。在滚动窗格的正下方。我提到了其他一些问题,但那没有帮助。这是我的代码:您是否尝试过设置
hBox.setAlignment(Pos.BASELINE\u CENTER)它似乎不起作用。它只稍微向上移动,但仍然在场景的左下角对齐。@user3845934不
BorderPane.setAlignment
您需要使用
hBox.setAlignment(Pos.BASELINE\u CENTER)hBox.setAlignment(Pos.BASELINE\u CENTER)它似乎不起作用。它只稍微向上移动,但仍然在场景的左下角对齐。@user3845934不
BorderPane.setAlignment
您需要使用
hBox.setAlignment(Pos.BASELINE\u CENTER)