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

如何捕获SciChart图例复选框点击事件以隐藏系列Y轴?

解决图例复选框事件捕获与Y轴空间填充问题

我刚好做过类似的需求,给你梳理一下具体的实现步骤,应该能帮你搞定:

一、捕获图例复选框的勾选/取消事件

在SciChart中,LegendModifier提供了监听图例项复选框状态变化的回调,你可以通过它来捕获用户的操作:

  1. 首先获取或创建LegendModifier实例(如果你的布局里已经有了,直接从SciChartSurface的modifiers集合中取出即可)
  2. 设置LegendItemCheckedListener,在回调里处理状态变化:
// 假设你已经有了SciChartSurface的实例sciChartSurface
LegendModifier legendModifier = null;
// 从已有的modifiers中找到LegendModifier
for (ChartModifierBase modifier : sciChartSurface.getChartModifiers()) {
    if (modifier instanceof LegendModifier) {
        legendModifier = (LegendModifier) modifier;
        break;
    }
}

// 如果没有找到,就新建一个
if (legendModifier == null) {
    legendModifier = new LegendModifier();
    sciChartSurface.getChartModifiers().add(legendModifier);
}

// 设置复选框状态监听
legendModifier.setLegendItemCheckedListener(new ILegendItemCheckedListener() {
    @Override
    public void onLegendItemChecked(LegendItemViewModel legendItem, boolean isChecked) {
        // 获取当前操作对应的系列
        IRenderableSeries targetSeries = legendItem.getRenderableSeries();
        // 获取该系列绑定的Y轴
        IAxis targetYAxis = targetSeries.getYAxis();
        
        // 根据勾选状态切换Y轴可见性
        targetYAxis.setVisible(isChecked);
        
        // 通知布局策略重新计算轴的布局
        yourCustomLayoutStrategy.invalidateLayoutParams();
        // 触发图表重绘,更新UI
        sciChartSurface.invalidateElement();
    }
});

二、让自定义布局策略适配隐藏的Y轴

你已经修改了RightAlignedOuterVerticallyStackedYAxisLayoutStrategy,接下来只需要确保它只计算可见Y轴的高度,这样隐藏的轴就不会占用空间,其他可见轴会自动填充空白:

@Override
protected void calculateYAxesLayout(List<IAxis> yAxes, int height, int width) {
    // 先过滤出所有可见的Y轴
    List<IAxis> visibleYAxes = new ArrayList<>();
    for (IAxis axis : yAxes) {
        if (axis.isVisible()) {
            visibleYAxes.add(axis);
        }
    }

    int visibleAxisCount = visibleYAxes.size();
    if (visibleAxisCount == 0) return;

    // 计算每个可见轴的高度(均分总高度)
    int perAxisHeight = height / visibleAxisCount;
    int currentTop = 0;

    for (IAxis axis : visibleYAxes) {
        AxisLayoutParams params = axis.getLayoutParams();
        params.y = currentTop;
        params.height = perAxisHeight;
        // 右侧轴的宽度计算保持你原来的逻辑即可
        params.width = getRequiredAxisWidth(axis, width);
        currentTop += perAxisHeight;
    }
}

三、额外注意事项

  • 确保每个RenderableSeries都正确绑定了对应的Y轴,不然在回调里拿不到目标轴就白搭了
  • 如果有默认隐藏的系列,记得初始化时把对应Y轴的setVisible(false)也加上,避免初始状态出现空白
  • 要是你的布局策略里有自定义的高度分配逻辑(不是均分),只需要把过滤可见轴的逻辑加进去,再调整高度计算即可

这样操作之后,用户取消勾选图例项时,对应的Y轴会被隐藏,布局策略会重新分配可见轴的高度,其他图表就会自动填充原来的空白区域了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:52:17