package com.jsonde.gui.components.timeChart; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.event.AxisChangeEvent; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.time.TimeSeriesCollection; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.*; import java.util.Date; public class PannableTimeChartPanel extends JPanel implements ChangeListener { private XYPlot plot; private BoundedRangeModel rangeModel; public PannableTimeChartPanel(long startTime, long endTime, TimeSeriesCollection dataset) { double interval = ((endTime - startTime) / (30000.)); JFreeChart chart = ChartFactory.createXYLineChart( "Memory Telemtry View", "Time", "Memory (Mb)", dataset, PlotOrientation.VERTICAL, true, true, false ); plot = (XYPlot) chart.getPlot(); DateAxis domainAxis = new DateAxis(); plot.setDomainAxis(domainAxis); domainAxis.setLabelAngle(Math.PI / 2); domainAxis.setAutoRange(true); domainAxis.setMinimumDate(new Date(startTime)); domainAxis.setMaximumDate(new Date(startTime + 30L * 1000L)); plot.setDomainPannable(true); setLayout(new BorderLayout()); add(new ChartPanel(chart), BorderLayout.CENTER); JScrollBar panScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); rangeModel = new DefaultBoundedRangeModel(); rangeModel.setMinimum(0); rangeModel.setMaximum((int)((interval - 1) * 100)); rangeModel.addChangeListener(this); panScrollBar.setModel(rangeModel); add(panScrollBar, BorderLayout.SOUTH); } private int previousValue; public void stateChanged(ChangeEvent e) { DateAxis domainAxis = (DateAxis) plot.getDomainAxis(); domainAxis.pan((double) (rangeModel.getValue() - previousValue) / 100.); plot.axisChanged(new AxisChangeEvent(domainAxis)); previousValue = rangeModel.getValue(); } }