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

Vaadin中ApexCharts饼图选择筛选后不更新问题求助

问题排查与修复方案

核心问题分析

你的代码存在两个关键问题导致图表无法更新:

  1. PieChart类设计冗余且逻辑冲突:继承ApexChartsBuilder的同时又维护了一个独立的内部builder实例,导致你配置的labels和series没有应用到最终生成的图表组件上。
  2. 图表更新未同步到界面:切换筛选条件时,要么只修改了builder但未重新生成/替换图表组件,要么新建了PieChart实例但未添加到容器中,Vaadin无法自动感知并渲染新数据。

修复步骤

1. 重构PieChart类(解决实例混淆问题)

去掉不必要的继承,改用组合模式封装图表构建逻辑,避免实例冲突:

import com.github.appreciated.apexcharts.ApexCharts;
import com.github.appreciated.apexcharts.ApexChartsBuilder;
import com.github.appreciated.apexcharts.config.builder.ChartBuilder;
import com.github.appreciated.apexcharts.config.builder.LegendBuilder;
import com.github.appreciated.apexcharts.config.builder.ResponsiveBuilder;
import com.github.appreciated.apexcharts.config.chart.Type;
import com.github.appreciated.apexcharts.config.legend.Position;
import com.github.appreciated.apexcharts.config.responsive.builder.OptionsBuilder;

public class PieChart {
    private final ApexChartsBuilder builder;
    private final String[] colors = {"#a7be54","#4a9342", "#be7e54"};

    public PieChart(){
        // 初始化基础配置
        builder = ApexChartsBuilder.get()
                .withChart(ChartBuilder.get().withType(Type.PIE).build())
                .withLegend(LegendBuilder.get()
                        .withPosition(Position.BOTTOM)
                        .build())
                .withColors(colors)
                .withResponsive(ResponsiveBuilder.get()
                        .withOptions(OptionsBuilder.get()
                                .withLegend(LegendBuilder.get().withPosition(Position.BOTTOM).build())
                                .build())
                        .build());
    }

    // 提供链式调用的配置方法
    public PieChart withLabels(String... labels) {
        builder.withLabels(labels);
        return this;
    }

    public PieChart withSeries(Number... series) {
        builder.withSeries(series);
        return this;
    }

    // 构建最终的图表组件
    public ApexCharts build() {
        ApexCharts chart = builder.build();
        chart.setHeight("25%");
        return chart;
    }
}

2. 修复DashboardView的图表更新逻辑

统一处理图表更新,每次切换筛选时清空旧图表并添加新图表:

import com.vaadin.flow.component.select.Select;
import com.vaadin.flow.component.verticallayout.VerticalLayout;
import org.springframework.http.HttpStatus;

public class DashboardView extends VerticalLayout {

    private final LogService logService;
    private VerticalLayout chartContainer = new VerticalLayout();
    private Select<String> filterBySelection = new Select<>();

    private static final String FILTER_BY_STATUS_CODE = "Status Code";
    private static final String FILTER_BY_DECISIONS = "Decisions";


    public DashboardView(LogService logService) {
        this.logService = logService;
        setSizeFull();
        chartContainer.setHeight("25%");
        chartContainer.setWidth("50%");
        getStyle().set("overflow", "auto");
        setSizeUndefined();
        prepareSelection();
        // 初始化默认图表
        updateChart(FILTER_BY_STATUS_CODE);
        add(chartContainer, filterBySelection);
    }

    // 统一更新图表的逻辑
    private void updateChart(String filterType) {
        // 清空容器中的旧图表
        chartContainer.removeAll();
        PieChart pieChart = new PieChart();
        
        if (filterType.equals(FILTER_BY_STATUS_CODE)) {
            pieChart.withLabels(String.valueOf(HttpStatus.BAD_REQUEST.value()), String.valueOf(HttpStatus.OK.value()))
                    .withSeries(logService.numberOfBadRequestLog(), logService.numberOfSuccessfulRequestLog());
        } else if (filterType.equals(FILTER_BY_DECISIONS)) {
            pieChart.withLabels("rewrite", "continue", "stop")
                    .withSeries(256.5, 52.4, 69.4);
        }
        
        // 添加新图表到容器
        chartContainer.add(pieChart.build());
    }

    private void prepareSelection(){
        filterBySelection.setLabel("Filter By");
        filterBySelection.setItems(FILTER_BY_STATUS_CODE, FILTER_BY_DECISIONS);
        filterBySelection.setValue(FILTER_BY_STATUS_CODE);
        filterBySelection.addValueChangeListener(it -> {
            updateChart(it.getValue());
        });
    }
}

修复说明

  1. PieChart重构:用组合模式替代继承,避免了原代码中父类与内部实例的配置冲突,确保所有labels和series的配置都能正确应用到最终图表。
  2. 界面同步更新:每次切换筛选时,先清空容器中的旧图表,再重新创建配置好的新图表并添加到容器中,Vaadin会自动渲染新组件,实现图表数据的切换。
  3. 逻辑统一:将图表更新逻辑集中到updateChart方法中,避免了原代码中重复创建实例却不更新界面的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:56