diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java index 0774bf010653969920110d988bdc09bdb9e3729c..b0044f5dcc8dbeae3173779055c4118a7f34eefe 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java @@ -17,6 +17,8 @@ package com.xeiam.xchart.demo; import java.awt.Dimension; import java.awt.GridLayout; +import java.util.Timer; +import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JPanel; @@ -49,6 +51,8 @@ import com.xeiam.xchart.demo.charts.line.LineChart03; import com.xeiam.xchart.demo.charts.line.LineChart04; import com.xeiam.xchart.demo.charts.line.LineChart05; import com.xeiam.xchart.demo.charts.line.LineChart06; +import com.xeiam.xchart.demo.charts.realtime.RealtimeChart01; +import com.xeiam.xchart.demo.charts.realtime.RealtimeChart02; import com.xeiam.xchart.demo.charts.scatter.ScatterChart01; import com.xeiam.xchart.demo.charts.scatter.ScatterChart02; import com.xeiam.xchart.demo.charts.scatter.ScatterChart03; @@ -71,7 +75,12 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { private JTree tree; /** The panel for chart */ - private JPanel chartPanel; + private XChartPanel chartPanel; + + /** real-time chart example */ + final RealtimeChart01 realtimeChart01 = new RealtimeChart01();; + final RealtimeChart02 realtimeChart02 = new RealtimeChart02();; + Timer timer = new Timer(); /** * Constructor @@ -102,12 +111,13 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { splitPane.setTopComponent(treeView); splitPane.setBottomComponent(chartPanel); - Dimension minimumSize = new Dimension(100, 125); + Dimension minimumSize = new Dimension(130, 160); treeView.setMinimumSize(minimumSize); splitPane.setPreferredSize(new Dimension(700, 700)); // Add the split pane to this panel. add(splitPane); + } @Override @@ -126,6 +136,37 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { // displayURL(chartInfo.bookURL); chartPanel = new XChartPanel(chartInfo.getExampleChart()); splitPane.setBottomComponent(chartPanel); + + // start running a simulated data feed for the sample real-time plot + timer.cancel(); // just in case + if (chartInfo.getExampleChartName().startsWith("RealtimeChart01")) { + // set up real-time chart simulated data feed + TimerTask chartUpdaterTask = new TimerTask() { + + @Override + public void run() { + + realtimeChart01.updateData(); + chartPanel.updateSeries(RealtimeChart01.SERIES_NAME, realtimeChart01.getyData()); + } + }; + timer = new Timer(); + timer.scheduleAtFixedRate(chartUpdaterTask, 0, 500); + } + else if (chartInfo.getExampleChartName().startsWith("RealtimeChart02")) { + // set up real-time chart simulated data feed + TimerTask chartUpdaterTask = new TimerTask() { + + @Override + public void run() { + + realtimeChart02.updateData(); + chartPanel.updateSeries(RealtimeChart02.SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData()); + } + }; + timer = new Timer(); + timer.scheduleAtFixedRate(chartUpdaterTask, 0, 500); + } } } @@ -139,112 +180,122 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { // categories DefaultMutableTreeNode category = null; // leaves - DefaultMutableTreeNode chart = null; + DefaultMutableTreeNode defaultMutableTreeNode = null; // Area category category = new DefaultMutableTreeNode("Area Charts"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("AreaChart01 - 3-Series", new AreaChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("AreaChart01 - 3-Series", new AreaChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("AreaChart02 - Null Y-Axis Data Points", new AreaChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("AreaChart02 - Null Y-Axis Data Points", new AreaChart02().getChart())); + category.add(defaultMutableTreeNode); // First category category = new DefaultMutableTreeNode("Line Charts"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart01 - Logarithmic Y-Axis", new LineChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart01 - Logarithmic Y-Axis", new LineChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart02 - Customized Series Style", new LineChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart02 - Customized Series Style", new LineChart02().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart03 - Extensive Chart Customization", new LineChart03().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart03 - Extensive Chart Customization", new LineChart03().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart04 - Hundreds of Series on One Plot", new LineChart04().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart04 - Hundreds of Series on One Plot", new LineChart04().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart05 - Scatter and Line", new LineChart05().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart05 - Scatter and Line", new LineChart05().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("LineChart06 - Logarithmic Y-Axis with Error Bars", new LineChart06().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("LineChart06 - Logarithmic Y-Axis with Error Bars", new LineChart06().getChart())); + category.add(defaultMutableTreeNode); // Scatter category category = new DefaultMutableTreeNode("Scatter Charts"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart01 - Gaussian Blob", new ScatterChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ScatterChart01 - Gaussian Blob", new ScatterChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart02 - Logarithmic Data", new ScatterChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ScatterChart02 - Logarithmic Data", new ScatterChart02().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart03 - Single point", new ScatterChart03().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ScatterChart03 - Single point", new ScatterChart03().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart04 - Error Bars", new ScatterChart04().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ScatterChart04 - Error Bars", new ScatterChart04().getChart())); + category.add(defaultMutableTreeNode); // Bar category category = new DefaultMutableTreeNode("Bar Charts"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("BarChart01 - Basic Bar Chart", new BarChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart01 - Basic Bar Chart", new BarChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("BarChart02 - Date Categories", new BarChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart02 - Date Categories", new BarChart02().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("BarChart03 - Positive and Negative", new BarChart03().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart03 - Positive and Negative", new BarChart03().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("BarChart04 - Missing Point in Series", new BarChart04().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart04 - Missing Point in Series", new BarChart04().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("BarChart05 - GGPlot2 Theme", new BarChart05().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart05 - GGPlot2 Theme", new BarChart05().getChart())); + category.add(defaultMutableTreeNode); // Theme category category = new DefaultMutableTreeNode("Chart Themes"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("ThemeChart01 - Default XChart Theme", new ThemeChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ThemeChart01 - Default XChart Theme", new ThemeChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("ThemeChart02 - GGPlot2 Theme", new ThemeChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ThemeChart02 - GGPlot2 Theme", new ThemeChart02().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("ThemeChart03 - Matlab Theme", new ThemeChart03().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("ThemeChart03 - Matlab Theme", new ThemeChart03().getChart())); + category.add(defaultMutableTreeNode); // Date category category = new DefaultMutableTreeNode("Date Charts"); top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart01 - Millisecond Scale", new DateChart01().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart01 - Millisecond Scale", new DateChart01().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart02 - Second Scale", new DateChart02().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart02 - Second Scale", new DateChart02().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart03 - Minute Scale", new DateChart03().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart03 - Minute Scale", new DateChart03().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart04 - Hour Scale", new DateChart04().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart04 - Hour Scale", new DateChart04().getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart05 - Day Scale", new DateChart05().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart05 - Day Scale", new DateChart05().getChart())); + category.add(defaultMutableTreeNode); + + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart06 - Month Scale", new DateChart06().getChart())); + category.add(defaultMutableTreeNode); + + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("DateChart07 - Year Scale", new DateChart07().getChart())); + category.add(defaultMutableTreeNode); + + // Real-time category + category = new DefaultMutableTreeNode("Real-time Charts"); + top.add(category); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart06 - Month Scale", new DateChart06().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("RealtimeChart01 - Fixed X-Axis Window", realtimeChart01.getChart())); + category.add(defaultMutableTreeNode); - chart = new DefaultMutableTreeNode(new ChartInfo("DateChart07 - Year Scale", new DateChart07().getChart())); - category.add(chart); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("RealtimeChart02 - Updating X-Axis Window", realtimeChart02.getChart())); + category.add(defaultMutableTreeNode); } diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt2.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java similarity index 69% rename from xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt2.java rename to xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java index 63506465ccf541d5e3bb679c15e8d4bda36692ac..9bc6db2e8b3661bfa4ad48c5e2cb87c6d52b7aed 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt2.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.xeiam.xchart.standalone; +package com.xeiam.xchart.demo.charts.realtime; import java.util.ArrayList; import java.util.List; @@ -21,26 +21,26 @@ import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; -import javax.swing.JPanel; import com.xeiam.xchart.Chart; import com.xeiam.xchart.XChartPanel; +import com.xeiam.xchart.demo.charts.ExampleChart; /** + * Realtime + * * @author timmolter */ -public class RealtimeAttempt2 { +public class RealtimeChart01 implements ExampleChart { - private Chart chart; - private XChartPanel chartPanel; - private static final String SERIES_NAME = "series1"; - private List<Number> yData; + private List<Double> yData; + public static final String SERIES_NAME = "series1"; - public static void main(String[] args) throws Exception { + public static void main(String[] args) { // Setup the panel - final RealtimeAttempt2 realtimeAttempt = new RealtimeAttempt2(); - realtimeAttempt.buildPanel(); + final RealtimeChart01 realtimeChart01 = new RealtimeChart01(); + final XChartPanel chartPanel = realtimeChart01.buildPanel(); // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. @@ -52,7 +52,7 @@ public class RealtimeAttempt2 { // Create and set up the window. JFrame frame = new JFrame("XChart"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.add(realtimeAttempt.getChartPanel()); + frame.add(chartPanel); // Display the window. frame.pack(); @@ -66,7 +66,9 @@ public class RealtimeAttempt2 { @Override public void run() { - realtimeAttempt.updateData(); + realtimeChart01.updateData(); + chartPanel.updateSeries(SERIES_NAME, realtimeChart01.getyData()); + } }; @@ -75,24 +77,40 @@ public class RealtimeAttempt2 { } - public void buildPanel() { + public XChartPanel buildPanel() { + + yData = getRandomData(5); + return new XChartPanel(getChart()); + } + + @Override + public Chart getChart() { yData = getRandomData(5); // Create Chart - chart = new Chart(500, 400); + Chart chart = new Chart(500, 400); chart.setChartTitle("Sample Real-time Chart"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); chart.addSeries(SERIES_NAME, null, yData); - chartPanel = new XChartPanel(chart); + return chart; + } + + private static List<Double> getRandomData(int numPoints) { + + List<Double> data = new ArrayList<Double>(); + for (int i = 0; i < numPoints; i++) { + data.add(Math.random() * 100); + } + return data; } public void updateData() { // Get some new data - List<Number> newData = getRandomData(1); + List<Double> newData = getRandomData(1); yData.addAll(newData); @@ -101,25 +119,10 @@ public class RealtimeAttempt2 { yData.remove(0); } - chartPanel.updateSeries(SERIES_NAME, yData); } - public Chart getChart() { + public List<Double> getyData() { - return chart; - } - - public JPanel getChartPanel() { - - return chartPanel; - } - - private static List<Number> getRandomData(int numPoints) { - - List<Number> data = new ArrayList<Number>(); - for (int i = 0; i < numPoints; i++) { - data.add(Math.random() * 100); - } - return data; + return yData; } } diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt3.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart02.java similarity index 72% rename from xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt3.java rename to xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart02.java index 8d011d895ff292d6a572ad803730d874d3cd9378..899d2e2db7c75d75e0377270d64f03fca2d6c861 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt3.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart02.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.xeiam.xchart.standalone; +package com.xeiam.xchart.demo.charts.realtime; import java.util.ArrayList; import java.util.List; @@ -21,27 +21,29 @@ import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; -import javax.swing.JPanel; import com.xeiam.xchart.Chart; import com.xeiam.xchart.XChartPanel; +import com.xeiam.xchart.demo.charts.ExampleChart; /** + * Realtime + * * @author timmolter */ -public class RealtimeAttempt3 { +public class RealtimeChart02 implements ExampleChart { private Chart chart; - private XChartPanel chartPanel; - private static final String SERIES_NAME = "series1"; + // private XChartPanel chartPanel; + public static final String SERIES_NAME = "series1"; private List<Integer> xData; private List<Double> yData; - public static void main(String[] args) throws Exception { + public static void main(String[] args) { // Setup the panel - final RealtimeAttempt3 realtimeAttempt = new RealtimeAttempt3(); - realtimeAttempt.buildPanel(); + final RealtimeChart02 realtimeChart02 = new RealtimeChart02(); + final XChartPanel chartPanel = realtimeChart02.buildPanel(); // Schedule a job for the event-dispatching thread: // creating and showing this application's GUI. @@ -53,7 +55,7 @@ public class RealtimeAttempt3 { // Create and set up the window. JFrame frame = new JFrame("XChart"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.add(realtimeAttempt.getChartPanel()); + frame.add(chartPanel); // Display the window. frame.pack(); @@ -67,7 +69,9 @@ public class RealtimeAttempt3 { @Override public void run() { - realtimeAttempt.updateData(); + realtimeChart02.updateData(); + chartPanel.updateSeries(SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData()); + } }; @@ -76,65 +80,73 @@ public class RealtimeAttempt3 { } - public void buildPanel() { + public XChartPanel buildPanel() { yData = getRandomData(5); xData = getMonotonicallyIncreasingData(5); + return new XChartPanel(getChart()); + } + + @Override + public Chart getChart() { + + xData = getMonotonicallyIncreasingData(5); + yData = getRandomData(5); + // Create Chart - chart = new Chart(500, 400); + Chart chart = new Chart(500, 400); chart.setChartTitle("Sample Real-time Chart"); chart.setXAxisTitle("X"); chart.setYAxisTitle("Y"); chart.addSeries(SERIES_NAME, xData, yData); - chartPanel = new XChartPanel(chart); + return chart; + } + + private List<Double> getRandomData(int numPoints) { + + List<Double> data = new ArrayList<Double>(); + for (int i = 0; i < numPoints; i++) { + data.add(Math.random() * 100); + } + return data; + } + + private List<Integer> getMonotonicallyIncreasingData(int numPoints) { + + List<Integer> data = new ArrayList<Integer>(); + for (int i = 0; i < numPoints; i++) { + data.add(i); + } + return data; } public void updateData() { // Get some new data - List<Double> newYData = getRandomData(1); - yData.addAll(newYData); + List<Double> newData = getRandomData(1); - xData.add(xData.get(xData.size() - 1) + 1); + yData.addAll(newData); // Limit the total number of points while (yData.size() > 20) { yData.remove(0); } + + xData.add(xData.get(xData.size() - 1) + 1); while (xData.size() > 20) { xData.remove(0); } - - chartPanel.updateSeries(SERIES_NAME, xData, yData); } - public Chart getChart() { + public List<Double> getyData() { - return chart; + return yData; } - public JPanel getChartPanel() { + public List<Integer> getxData() { - return chartPanel; - } - - private List<Double> getRandomData(int numPoints) { - - List<Double> data = new ArrayList<Double>(); - for (int i = 0; i < numPoints; i++) { - data.add(Math.random() * 100); - } - return data; - } - - private List<Integer> getMonotonicallyIncreasingData(int numPoints) { - - List<Integer> data = new ArrayList<Integer>(); - for (int i = 0; i < numPoints; i++) { - data.add(i); - } - return data; + return xData; } } diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt1.java b/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt1.java deleted file mode 100644 index c41260f4e80705bdc8a9ca5a06d916cb465a18ed..0000000000000000000000000000000000000000 --- a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/RealtimeAttempt1.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright 2011 - 2014 Xeiam LLC. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.xeiam.xchart.standalone; - -import java.util.ArrayList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -import javax.swing.JFrame; -import javax.swing.JPanel; - -import com.xeiam.xchart.Chart; -import com.xeiam.xchart.Series; -import com.xeiam.xchart.SeriesMarker; -import com.xeiam.xchart.XChartPanel; - -/** - * @author rossjourdain - */ -public class RealtimeAttempt1 { - - private Chart chart; - private JPanel chartPanel; - - public static void main(String[] args) throws Exception { - - // Setup the panel - final RealtimeAttempt1 realtimeAttempt = new RealtimeAttempt1(); - realtimeAttempt.buildPanel(); - - // Schedule a job for the event-dispatching thread: - // creating and showing this application's GUI. - javax.swing.SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - - // Create and set up the window. - JFrame frame = new JFrame("XChart"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.add(realtimeAttempt.getChartPanel()); - - // Display the window. - frame.pack(); - frame.setVisible(true); - } - }); - - // Simulate a data feed - TimerTask chartUpdaterTask = new TimerTask() { - - @Override - public void run() { - - realtimeAttempt.updateData(); - } - }; - - Timer timer = new Timer(); - timer.scheduleAtFixedRate(chartUpdaterTask, 0, 500); - - } - - public void buildPanel() { - - List<Double> yData = getRandomData(5); - - // Create Chart - chart = new Chart(500, 400); - chart.setChartTitle("Sample Chart"); - chart.setXAxisTitle("X"); - chart.setYAxisTitle("Y"); - Series series = chart.addSeries("y(x)", null, yData); - series.setMarker(SeriesMarker.CIRCLE); - - chartPanel = new XChartPanel(chart); - } - - public void updateData() { - - // Get some new data - List<Double> newData = getRandomData(1); - - // Replace the existing - List<Double> replacementData = new ArrayList<Double>(); - - Series oldSeries = (Series) chart.getSeriesMap().values().toArray()[0]; - List<Double> oldData = (List<Double>) oldSeries.getYData(); - replacementData.addAll(oldData); - - replacementData.addAll(newData); - - // Limit the total number of points - while (replacementData.size() > 20) { - replacementData.remove(0); - } - - // Swap out the data - chart.getSeriesMap().clear(); - Series newSeries = chart.addSeries(oldSeries.getName(), null, replacementData); - newSeries.setLineColor(oldSeries.getStrokeColor()); - newSeries.setLineStyle(oldSeries.getStroke()); - newSeries.setMarkerColor(oldSeries.getMarkerColor()); - // etc - - // Re-display the chart - chartPanel.revalidate(); - chartPanel.repaint(); - } - - public Chart getChart() { - - return chart; - } - - public JPanel getChartPanel() { - - return chartPanel; - } - - private static List<Double> getRandomData(int numPoints) { - - List<Double> data = new ArrayList<Double>(); - for (int i = 0; i < numPoints; i++) { - data.add(Math.random() * 100); - } - return data; - } -}