Java tutorial
/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2012 RomRaider.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.logger.ecu.ui.tab; import com.romraider.logger.ecu.ui.handler.graph.SpringUtilities; import static com.romraider.util.ParamChecker.checkNotNull; import jamlab.Polyfit; import static java.awt.Color.BLACK; import static java.awt.Color.BLUE; import static java.awt.Color.GREEN; import static java.awt.Color.RED; import static java.awt.Color.WHITE; import static org.jfree.chart.ChartFactory.createScatterPlot; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import static org.jfree.chart.plot.PlotOrientation.VERTICAL; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; import org.jfree.chart.renderer.xy.XYDotRenderer; import org.jfree.data.xy.XYDataItem; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import javax.swing.JPanel; import javax.swing.SpringLayout; import java.awt.Color; import java.awt.Dimension; public final class LoggerChartPanel extends JPanel { private static final long serialVersionUID = -6579979878171615665L; private static final Color DARK_GREY = new Color(80, 80, 80); private static final Color LIGHT_GREY = new Color(110, 110, 110); private final XYSeries data = new XYSeries("Data"); private final XYTrendline trendline = new XYTrendline(data); private final XYSeries hilite = new XYSeries("Hilite"); private final String labelX; private final String labelY; public LoggerChartPanel(String labelX, String labelY) { super(new SpringLayout()); checkNotNull(labelX, labelY); this.labelX = labelX; this.labelY = labelY; addChart(); } public synchronized void addData(double x, double y) { if (hilite.getItemCount() == 1) { XYDataItem item = hilite.remove(0); data.add(item); } hilite.add(x, y); } public void clear() { trendline.clear(); hilite.clear(); data.clear(); } public void interpolate(int order) { trendline.update(order); } public double[] calculate(double[] x) { return trendline.calculate(x); } public double[] getPolynomialCoefficients() { Polyfit fit = trendline.getPolyFit(); return fit.getPolynomialCoefficients(); } private void addChart() { ChartPanel chartPanel = new ChartPanel(createChart(), false, true, true, true, true); chartPanel.setMinimumSize(new Dimension(400, 300)); chartPanel.setPreferredSize(new Dimension(500, 400)); add(chartPanel); SpringUtilities.makeCompactGrid(this, 1, 1, 2, 2, 2, 2); } private JFreeChart createChart() { JFreeChart chart = createScatterPlot(null, labelX, labelY, null, VERTICAL, false, true, false); chart.setBackgroundPaint(BLACK); configurePlot(chart); addSeries(chart, 0, hilite, 4, GREEN); addTrendLine(chart, 1, trendline, BLUE); addSeries(chart, 2, data, 2, RED); return chart; } private void configurePlot(JFreeChart chart) { XYPlot plot = chart.getXYPlot(); plot.setBackgroundPaint(BLACK); plot.getDomainAxis().setLabelPaint(WHITE); plot.getRangeAxis().setLabelPaint(WHITE); plot.getDomainAxis().setTickLabelPaint(LIGHT_GREY); plot.getRangeAxis().setTickLabelPaint(LIGHT_GREY); plot.setDomainGridlinePaint(DARK_GREY); plot.setRangeGridlinePaint(DARK_GREY); plot.setOutlinePaint(DARK_GREY); plot.setRenderer(buildScatterRenderer(2, RED)); } private XYDotRenderer buildScatterRenderer(int size, Color color) { XYDotRenderer renderer = new XYDotRenderer(); renderer.setDotHeight(size); renderer.setDotWidth(size); renderer.setSeriesPaint(0, color); return renderer; } private void addTrendLine(JFreeChart chart, int index, XYTrendline trendline, Color color) { XYPlot plot = chart.getXYPlot(); plot.setDataset(index, trendline); plot.setRenderer(index, buildTrendLineRenderer(color)); } private void addSeries(JFreeChart chart, int index, XYSeries series, int size, Color color) { XYDataset dataset = new XYSeriesCollection(series); XYPlot plot = chart.getXYPlot(); plot.setDataset(index, dataset); plot.setRenderer(index, buildScatterRenderer(size, color)); } private StandardXYItemRenderer buildTrendLineRenderer(Color color) { StandardXYItemRenderer renderer = new StandardXYItemRenderer(); renderer.setSeriesPaint(0, color); return renderer; } }