JavaFX中库存TilePane嵌入ScrollPane后滚动条不显示问题求助
问题:ScrollPane滚动条不显示的库存系统问题
我是StackOverflow新用户,若发帖格式有误敬请谅解。我为一款俯视角地图类游戏开发了库存系统,库存面板用于展示角色携带的所有物品。我创建了带删除按钮的独立HBox,并尝试将这些HBox放入ScrollPane(可滚动面板)中,但滚动条始终不显示,恳请各位提供帮助。相关代码如下:
private void displayInvStructure() { this.setVgap(4); this.setHgap(4); this.setPadding(new Insets(1)); this.setPrefColumns(4); this.setStyle("-fx-background-color: #fff4a8; -fx-padding: 5; -fx-spacing: 5; -fx-border-color: black; -fx-border-width: 2px;"); HBox itemTile[] = new HBox[31]; for (int i = 0; i < 31; i++) { Button deleteButton = new Button("Delete Item"); deleteButton.setOnAction((ActionEvent event) -> { //Creates event when button clicked JOptionPane.showMessageDialog(null, "Item has been deleted", null, 1); }); itemTile[i] = new HBox(new Label("Item: " + i + " ")); itemTile[i].setStyle("-fx-border-color: black;"); itemTile[i].setPadding(new Insets(5)); itemTile[i].getChildren().add(deleteButton); itemTile[i].setAlignment(Pos.CENTER_LEFT); itemTile[i].setStyle("-fx-background-color: #e5efff; -fx-border-color: black;"); this.getChildren().add(itemTile[i]); } ScrollPane sp = new ScrollPane(); sp.setFitToWidth(true); sp.setContent(this); }
解决方案
嘿,我看了你的代码,发现滚动条不显示主要有两个核心问题,咱们一步步来修复:
1. ScrollPane没有被添加到场景图中
你创建了ScrollPane sp,但代码里没有把它添加到任何父容器或者场景里——也就是说这个ScrollPane压根没被展示出来,自然看不到滚动条啦。你需要把它加到你的界面层级里,比如如果this是一个GridPane,那应该把ScrollPane作为最终要显示的容器,而不是直接展示this。
2. 内容容器(你的GridPane)没有超出ScrollPane的视口大小
GridPane默认会自动调整自身大小来适配所有子节点,再加上你设置了sp.setFitToWidth(true)(强制内容宽度匹配ScrollPane),如果没有给ScrollPane设置固定的高度约束,它会跟着GridPane一起无限拉伸,永远不会触发滚动条。
修改后的完整代码示例
private void displayInvStructure() { // 假设this是GridPane this.setVgap(4); this.setHgap(4); this.setPadding(new Insets(1)); this.setPrefColumns(4); this.setStyle("-fx-background-color: #fff4a8; -fx-padding: 5; -fx-spacing: 5; -fx-border-color: black; -fx-border-width: 2px;"); HBox itemTile[] = new HBox[31]; for (int i = 0; i < 31; i++) { Button deleteButton = new Button("Delete Item"); deleteButton.setOnAction((ActionEvent event) -> { JOptionPane.showMessageDialog(null, "Item has been deleted", null, 1); }); itemTile[i] = new HBox(new Label("Item: " + i + " ")); // 合并重复的style设置,避免覆盖 itemTile[i].setStyle("-fx-background-color: #e5efff; -fx-border-color: black;"); itemTile[i].setPadding(new Insets(5)); itemTile[i].getChildren().add(deleteButton); itemTile[i].setAlignment(Pos.CENTER_LEFT); this.getChildren().add(itemTile[i]); } ScrollPane sp = new ScrollPane(); sp.setFitToWidth(true); // 给ScrollPane设置固定的首选高度,当GridPane内容高度超过这个值时,滚动条就会触发 sp.setPrefHeight(400); // 可根据你的界面需求调整数值 // 也可以设置最大高度,让它适配父容器但有上限 // sp.setMaxHeight(Region.USE_COMPUTED_SIZE); sp.setContent(this); // 关键:把ScrollPane添加到父容器或场景中(根据你的界面结构调整) // 示例:如果当前类是一个Pane的子类 // getChildren().add(sp); // 示例:如果是在Stage中设置场景 // Scene scene = new Scene(sp); // yourStage.setScene(scene); }
额外优化提示
- 你之前重复调用了
itemTile[i].setStyle,后面的会覆盖前面的样式,我已经把它们合并成一个了。 - 如果需要水平滚动条,可以把
sp.setFitToWidth(true)改成false,并确保GridPane的宽度超过ScrollPane的视口。 - 也可以给GridPane设置
setPrefRows来限制行数,当子节点超过行数时,GridPane的高度会自动扩展,进而触发ScrollPane的滚动条。
试试这些修改,应该就能看到滚动条正常工作啦!如果还有问题,可以告诉我你的容器层级细节,比如this具体是什么类型的Pane,或者你是怎么组织界面结构的。
内容的提问来源于stack exchange,提问作者wastedyears1981
相关产品推荐
相关产品推荐

