Java ScrollPane scroll不适用于其他节点
我想让StackPane作为我的根窗格。我想在场景中间有一个滚动窗格,一个小盒子,两个按钮<强>下面<强>容器。 我试图通过编写以下代码来实现这一点: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
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)谢谢,但我有个问题。当我使用BorderPane作为根时,我无法将其居中到我正在谈论的位置。在滚动窗格的正下方。我提到了其他一些问题,但那没有帮助。这是我的代码:您是否尝试过设置hBox.setAlignment(Pos.BASELINE\u CENTER)代码>它似乎不起作用。它只稍微向上移动,但仍然在场景的左下角对齐。@user3845934不BorderPane.setAlignment
您需要使用hBox.setAlignment(Pos.BASELINE\u CENTER)代码>