我有一些代码可以在单击 LegendItemEntity 时隐藏/显示一系列。该代码有效,只是我使用系列的索引作为 LegendItemCollection 中 LegendItem 的索引。问题是有时系列比 LegendItems 更多,并且它们各自的索引并不相同。鉴于我有 LegendItemEntity,如何获取 LegendItem?
private final ChartMouseListener chartMouseListener = new ChartMouseListener() {
public void chartMouseClicked(ChartMouseEvent cme) {
ChartEntity entity = cme.getEntity();
if (entity instanceof LegendItemEntity) {
LegendItemEntity itemEntity = (LegendItemEntity) entity;
int index = dataset.getSeriesIndex(itemEntity.getSeriesKey());
XYPlot plot = (XYPlot) chart.getPlot();
XYItemRenderer renderer = plot.getRenderer();
renderer.setSeriesVisible(index, !renderer.isSeriesVisible(index));
LegendItem legendItem = plot.getLegendItems().get(index);
if (renderer.isSeriesVisible(index)) {
legendItem.setLinePaint(renderer.getSeriesPaint(index));
} else {
legendItem.setLinePaint(Color.WHITE);
}
}
}
public void chartMouseMoved(ChartMouseEvent cme) {
}
};
您可以使用
renderer.getLegendItem()
。对于不可见系列,结果将为 null
。给定 JFreeChart chart
,chartMouseClicked()
的实现可能如下所示:
@Override
public void chartMouseClicked(ChartMouseEvent e) {
if (e.getEntity() instanceof LegendItemEntity itemEntity) {
var key = itemEntity.getSeriesKey();
var dataset = (XYDataset) itemEntity.getDataset();
int seriesIndex = dataset.indexOf(key);
var plot = chart.getXYPlot();
var datasetIndex = plot.indexOf(dataset);
var renderer = plot.getRenderer();
LegendItem legendItem = renderer.getLegendItem(datasetIndex, seriesIndex);
System.out.print(key + " " + datasetIndex + " " + seriesIndex);
System.out.println(" " + legendItem);
}
}