jfreechart绘制带刻度尺的折线图

jfreechart绘制带刻度尺的折线图

概述

(一)在折线图单机鼠标之后出现竖线,同步显示该竖线和折线交点的纵坐标值和横坐标值

效果图

在这里插入图片描述

实现

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
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值