概述
(一)在折线图单机鼠标之后出现竖线,同步显示该竖线和折线交点的纵坐标值和横坐标值
效果图
实现
TimeSeriesChart.java
该类为双纵轴折线图工具类
package encontrol.tool;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.block.*;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.CompositeTitle;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.*;
import org.jfree.ui.*;
import encontrol.data.TestData;
import encontrol.entity.ChartData;
import encontrol.entity.PointInfoBean;
/**
* 双纵轴折线图
* @author qinxinhua
* 2021年3月26日10:03:33
*/
public class TimeSeriesChart{
//每多少分钟一个点
private int timeLen;
//一共多少个点
private int count;
//图表
private JFreeChart chart;
private List<ChartData> dataChart;
private ChartPanel chartPan;
//图例字体
private Font fontLabel = new Font("苹方字体", Font.PLAIN, 17);
private Font tip = new Font("苹方字体", Font.PLAIN, 15);
//数据集
private TimeSeriesCollection dataset;
//存储数据点的横纵坐标
private Map<Integer,Map<Integer,Double>> posValue;
//鼠标移动误差为前后1分钟 60000
private double deviation;
//今天0点0分0秒是第几毫秒
private long dayBegin;
private Map<Integer,PointInfoBean> tips;
private int xPox = 0;
private int yPoy = 0;
private String timeNow="00:00";
private SimpleDateFormat pomit = new SimpleDateFormat("HH:mm");
/**
* 构造函数
*/
public TimeSeriesChart(){
init();
}
/**
* 初始化方法
*/
public void init() {
dataChart = new ArrayList<ChartData>();
posValue = new HashMap<Integer,Map<Integer,Double>>();
tips = new HashMap<Integer,PointInfoBean>();
dataset = new TimeSeriesCollection( );
timeLen = 15;
deviation = timeLen*(60*1000);
count = 1440/timeLen;
SimpleDateFormat sdfOne = new SimpleDateFormat("yyyy-MM-dd");
String day = sdfOne.format(Calendar.getInstance().getTime()).toString();
try {
dayBegin = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(day+" 00:00").getTime();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取堆叠图panel
* @return
*/
@SuppressWarnings("serial")
public JPanel getChartPanel(List<ChartData> dataList) {
dataChart = dataList;
JPanel chartPanel = new JPanel(new BorderLayout());
chartPanel.setOpaque(false);
JFreeChart chartPa = createChart(dataList);
chartPan = new ChartPanel(chartPa, false) {
private boolean domainCrosshairState = false;
protected transient Line2D verticalTraceLine1 ;
//序列号
int index = 0;
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
super.mouseClicked(arg0);
domainCrosshairState = !domainCrosshairState;
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
super.mouseMoved(arg0);
if(domainCrosshairState) {
int xPos = arg0.getX();
int yPos = arg0.getY();
Point2D point2D = chartPan.translateScreenToJava2D(new Point(xPos, yPos));
XYPlot xyPlot = (XYPlot)chart.getPlot();
ChartRenderingInfo chartRenderingInfo = chartPan.getChartRenderingInfo();
Rectangle2D rectangle2D = chartRenderingInfo.getPlotInfo().getDataArea();
ValueAxis valueDAxis = xyPlot.getDomainAxis(0);
RectangleEdge xrectangleEdge = xyPlot.getDomainAxisEdge(0);
double xal