You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:02:47