/* * RunningChart, a test for the Chart2D. * Copyright (c) 2007 - 2011 Achim Westermann, Achim.Westermann@gmx.de * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * If you modify or optimize the code in a useful way please let me know. * Achim.Westermann@gmx.de */ package info.monitorenter.gui.chart.demos; import info.monitorenter.gui.chart.Chart2D; import info.monitorenter.gui.chart.ITrace2D; import info.monitorenter.gui.chart.ITracePainter; import info.monitorenter.gui.chart.rangepolicies.RangePolicyMinimumViewport; import info.monitorenter.gui.chart.traces.Trace2DLtd; import info.monitorenter.gui.chart.traces.painters.TracePainterPolyline; import info.monitorenter.gui.chart.views.ChartPanel; import info.monitorenter.reflection.ObjRecorder2Trace2DAdapter; import info.monitorenter.util.Range; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; /** * A test for the <code>Chart2D</code> that constantly adds new tracepoints to a * <code> Trace2DLtd</code>. Mainly the runtime- scaling is interesting. * <p> * Furthermore this is an example on how to connect other components to the * <code>Chart2D</code> using an adaptor- class. If interested have a look on * {@link info.monitorenter.reflection.ObjRecorder2Trace2DAdapter}. * <p> * * @author <a href='mailto:Achim.Westermann@gmx.de'> Achim Westermann </a> * @version $Revision: 1.5 $ */ public class AntialiasingChart extends JFrame { /** * Helper class that holds an internal number that is randomly modified by a * Thread. * <p> * * @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann </a> * @version $Revision: 1.5 $ */ static class RandomBumper extends Thread { /** Streches or compresses the grade of jumping of the internal number. */ protected double m_factor; /** The bumping number. */ protected double m_number = 0; /** The propability of an increase versus a decrease of the bumped number. */ protected double m_plusminus = 0.5; /** Needed for randomization of bumping the number. */ protected java.util.Random m_randomizer = new java.util.Random(); /** * Creates an instance. * <p> * * @param plusminus * probability to increase or decrease the number each step. * @param factor * affects the amplitude of the number (severity of jumps). */ public RandomBumper(final double plusminus, final int factor) { if (plusminus < 0 || plusminus > 1) { System.out.println(this.getClass().getName() + " ignores constructor-passed value. Must be between 0.0 and 1.0!"); } else { this.m_plusminus = plusminus; } this.m_factor = factor; this.setDaemon(true); this.start(); } /** * @see java.lang.Runnable#run() */ @Override public void run() { while (true) { double rand = this.m_randomizer.nextDouble(); if (rand < this.m_plusminus) { this.m_number += this.m_randomizer.nextDouble() * this.m_factor; } else { this.m_number -= this.m_randomizer.nextDouble() * this.m_factor; } try { Thread.sleep(20); } catch (InterruptedException e) { // nop } } } } /** * Generated for <code>serialVersionUID</code>. */ private static final long serialVersionUID = 3545231432038627123L; /** * Main entry. * <p> * * @param args * ignored. */ public static void main(final String[] args) { Chart2D chart = new Chart2D(); chart.setUseAntialiasing(true); chart.setMinPaintLatency(20); ITrace2D data = new Trace2DLtd(300); data.setStroke(new BasicStroke(3)); data.setColor(new Color(255, 0, 0, 255)); data.setName("random"); data.setPhysicalUnits("hertz", "ms"); ITracePainter<?> dotPainter = new TracePainterPolyline(); data.setTracePainter(dotPainter); chart.addTrace(data); AntialiasingChart wnd = new AntialiasingChart(chart, "AntialiasingChart"); chart.getAxisX().setPaintGrid(true); chart.getAxisX().setStartMajorTick(false); chart.getAxisY().setPaintGrid(true); chart.getAxisX().setPaintScale(true); chart.getAxisX().setPaintScale(true); // force ranges: chart.getAxisY().setRangePolicy(new RangePolicyMinimumViewport(new Range(-1e4, +1e4))); // chart.setFont(new Font(null,0,12)); wnd.setLocation(200, 300); wnd.setSize(700, 210); wnd.setResizable(true); wnd.setVisible(true); new ObjRecorder2Trace2DAdapter(data, new RandomBumper(0.5, 1000), "m_number", 1000); } /** The chart to use. */ protected Chart2D m_chart = null; /** * Creates an instance that will dynamically paint on the chart to a trace * with the given label. * <p> * * @param chart * the chart to use. * @param label * the name of the trace too display. */ public AntialiasingChart(final Chart2D chart, final String label) { super(label); this.m_chart = chart; this.addWindowListener(new WindowAdapter() { /** * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent) */ @Override public void windowClosing(final WindowEvent e) { AntialiasingChart.this.setVisible(false); AntialiasingChart.this.dispose(); System.exit(0); } }); Container contentPane = this.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(new ChartPanel(this.m_chart), BorderLayout.CENTER); } }