在JFreeChart中获得图表上某一点的[x,y]值,可以通过以下步骤实现:
JFreeChart
对象。ChartMouseEvent
或ChartMouseMotionEvent
监听器来捕捉鼠标在图表上的事件。getChart()
方法获取到当前的图表对象。ChartRenderingInfo
对象可以获取到图表的渲染信息,其中包含了每个数据点在图表上的位置信息。MouseEvent
中的坐标信息,可以使用getEntityCollection()
方法获取到渲染信息中的EntityCollection
对象。EntityCollection
对象中的实体,可以判断鼠标事件发生的点是否在数据点的范围内。ChartEntity
对象的getArea()
方法获取到数据点的矩形区域。以下是一个简单的示例代码,演示了如何在JFreeChart中获得图表上某一点的[x,y]值:
// 导入必要的包
import org.jfree.chart.*;
import org.jfree.chart.entity.*;
import org.jfree.chart.plot.*;
import org.jfree.data.general.*;
import java.awt.*;
import java.awt.event.*;
public class ChartMouseListenerExample {
public static void main(String[] args) {
// 创建一个数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1.0, "Series 1", "Category 1");
dataset.addValue(2.0, "Series 1", "Category 2");
dataset.addValue(3.0, "Series 1", "Category 3");
// 创建一个图表
JFreeChart chart = ChartFactory.createLineChart(
"Chart Title", "Category", "Value", dataset,
PlotOrientation.VERTICAL, true, true, false);
// 创建一个图表面板
ChartPanel chartPanel = new ChartPanel(chart);
// 添加鼠标事件监听器
chartPanel.addChartMouseListener(new ChartMouseListener() {
@Override
public void chartMouseClicked(ChartMouseEvent event) {
// 获取图表对象
JFreeChart chart = event.getChart();
// 获取渲染信息
ChartRenderingInfo info = chartPanel.getChartRenderingInfo();
// 获取鼠标事件发生的点的坐标
int mouseX = event.getTrigger().getX();
int mouseY = event.getTrigger().getY();
// 获取实体集合
EntityCollection entities = info.getEntityCollection();
// 遍历实体集合,判断事件发生的点是否在数据点的范围内
for (Object entity : entities.getEntities()) {
if (entity instanceof XYItemEntity) {
XYItemEntity itemEntity = (XYItemEntity) entity;
// 获取数据点的矩形区域
Rectangle2D dataArea = info.getPlotInfo().getDataArea();
Rectangle2D rect = itemEntity.getArea(dataArea, chart.getXYPlot().getOrientation());
// 判断鼠标事件发生的点是否在数据点的范围内
if (rect.contains(mouseX, mouseY)) {
// 获取数据点的[x,y]值
double x = itemEntity.getDataset().getXValue(itemEntity.getSeriesIndex(), itemEntity.getItem());
double y = itemEntity.getDataset().getYValue(itemEntity.getSeriesIndex(), itemEntity.getItem());
System.out.println("[" + x + ", " + y + "]");
break;
}
}
}
}
@Override
public void chartMouseMoved(ChartMouseEvent event) {
// 空实现
}
});
// 创建一个窗口显示图表
JFrame frame = new JFrame("Chart Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(chartPanel);
frame.setSize(500, 500);
frame.setVisible(true);
}
}
这是一个简单的例子,它创建了一个折线图,并在鼠标点击图表上的数据点时,打印出该数据点的[x,y]值。请注意,这里只是示例代码,并没有涵盖所有的情况,实际应用中还需要根据具体需求进行适当的修改和处理。
作为腾讯云的相关产品和产品介绍链接,可以参考以下链接获取更多信息:
领取专属 10元无门槛券
手把手带您无忧上云