我正在使用JFreeChart。
当我点击一个Legend项目时,我已经放了一个监听器。在听众中,我使被点击的系列变得无形。但作为一个副作用,该系列也从传奇中消失了。
我不希望这个系列从传说中消失。我能做些什么才能在情节上显示/隐藏系列,但不影响传奇。
使用plot.setFixedLegendItems(list)设置要修复的图例会导致其他鼠标效果停止工作(鼠标悬停在数据点上时,系列行当前变得更粗,在图例中也相同)。
chartPanel.addChartMouseListener(new ChartMouseListener() {
@Override
public void chartMouseClicked(ChartMouseEvent event) {
ChartEntity entity = event.getEntity();
if (entity instanceof LegendItemEntity) {
//*
LegendItemEntity itemEntity = (LegendItemEntity) entity;
XYDataset dataset = (XYDataset) itemEntity.getDataset();
int index = dataset.indexOf(itemEntity.getSeriesKey());
XYPlot plot = (XYPlot) event.getChart().getPlot();
//set the renderer to hide the series
XYItemRenderer renderer = plot.getRenderer();
renderer.setSeriesVisible(index, !renderer.isSeriesVisible(index), false);
renderer.setSeriesVisibleInLegend(index, true, false);
//*/
}
}
});
答案 0 :(得分:2)
getLegendItems()
类中的XYPlot
方法执行可见性检查,因此您可以将XYPlot子类化并覆盖此方法(或者如果要构建自己的自定义版本,则直接修改它JFreeChart
)。
答案 1 :(得分:2)
您还可以呼叫getLegendItems()
,将其另存为LegendItemCollection
并在发生任何动作侦听器之前设置plot.setFixedLegendItems(legendItems)
。通过这种方式,它可以将所有图例项目设置为初始状态,即使单击图例项目也是如此。
XYPlot plot = chart.getXYPlot();
LegendItemCollection legendItems = plot.getLegendItems();
plot.setFixedLegendItems(legendItems);
chartPanel.addChartMouseListener(new ChartMouseListener() {
@Override
public void chartMouseClicked(ChartMouseEvent chartMouseEvent) {
ChartEntity entity = chartMouseEvent.getEntity();
if (chartMouseEvent.getEntity() instanceof LegendItemEntity) {
LegendItemEntity itemEntity = (LegendItemEntity) entity;
XYDataset dataset = (XYDataset) itemEntity.getDataset();
int index = dataset.indexOf(itemEntity.getSeriesKey());
XYPlot plot = (XYPlot) chartMouseEvent.getChart().getPlot();
//set the renderer to hide the series
XYItemRenderer renderer = plot.getRenderer();
renderer.setSeriesVisible(index, !renderer.isSeriesVisible(index), true);
}
}
答案 2 :(得分:1)
谢谢大卫。你的提示对我很有帮助,可能还有很多其他人。
我建议您更改XYPlot.getLegendItems()默认代码,这样即使在图中不可见,它也允许系列显示在图例中:
for (int i = 0; i < seriesCount; i++) {
boolean v1 = renderer.isSeriesVisible(i);
boolean v2 = renderer.isSeriesVisibleInLegend(i);
if (v2) {// original code: v1 && v2
boolean workaround = !v1 && v2;
if (workaround) renderer.setSeriesVisible(i, true, false);// temporarily enable before getLegendItem()
LegendItem item = renderer.getLegendItem(datasetIndex, i);
if (workaround) renderer.setSeriesVisible(i, false, false);