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

JavaFX自定义ListCell实现问题:渲染空白单元格求助

问题分析与解决方案

你的代码存在几个关键问题导致单元格空白:

  1. 泛型类型不匹配
    你的ListView声明为ListView<String>,但实际数据是Product类型,这会导致updateItem方法中的item始终为null,触发空白逻辑。

  2. CellFactory被重复设置
    你在遍历Product的循环内反复调用setCellFactory,最终只有最后一次设置的CellFactory生效,且每个CellFactory绑定的是固定的vbox,无法动态对应每个产品数据。

  3. 布局组件与数据绑定错误
    你提前为每个Product创建了布局,但单元格是复用机制,应该在Cell内部创建布局模板,每次更新时根据当前数据刷新内容。


修正后的代码

首先确保你的myList是ListView<Product>类型,然后修改FetchingProducts方法:

public void FetchingProducts() {
    Product product = new Product();
    List<Product> products = product.getProducts();

    // 设置CellFactory,只需要执行一次
    myList.setCellFactory(listView -> new ListCell<Product>() {
        // 在Cell内部创建布局组件,复用这些组件
        private final VBox vbox = new VBox();
        private final HBox hbox1 = new HBox();
        private final HBox hbox2 = new HBox();
        private final Label nameLabel = new Label();
        private final Label priceLabel = new Label();
        private final Label thresholdLabel = new Label();

        // 初始化布局,只执行一次
        {
            hbox1.getChildren().add(nameLabel);
            hbox2.getChildren().addAll(priceLabel, thresholdLabel);
            vbox.getChildren().addAll(hbox1, hbox2);
            // 可添加样式优化布局
            VBox.setMargin(hbox2, new Insets(5, 0, 0, 0));
            HBox.setSpacing(20);
        }

        @Override
        protected void updateItem(Product item, boolean empty) {
            super.updateItem(item, empty);
            if (empty || item == null) {
                setGraphic(null);
                setText(null);
            } else {
                // 根据当前Product更新标签内容
                nameLabel.setText(item.getNomProduit());
                priceLabel.setText(String.valueOf(item.getPrixVente()));
                thresholdLabel.setText(String.valueOf(item.getSeuilQte()));
                setGraphic(vbox);
            }
        }
    });

    // 将产品数据设置到ListView
    myList.getItems().setAll(products);
}

关键修正点说明

  • 泛型对齐:将ListView和ListCell的泛型改为Product,确保updateItem能获取到正确的产品数据。
  • CellFactory只设置一次:CellFactory是单元格的模板生成器,只需初始化一次,不需要遍历数据重复设置。
  • 内部布局复用:在Cell的构造块中初始化布局组件,避免每次更新都创建新组件,提升性能,同时在updateItem中动态更新标签文本。
  • 正确设置数据源:最后通过getItems().setAll(products)将产品数据传入ListView,让CellFactory能对应每个数据项渲染内容。

内容的提问来源于stack exchange,提问作者Salah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:25:14