diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java index c96c243f8729254870008472f16ee2dfd3b8f12d..ce3828b9c9263291adbf23f9c62c9cc76f01898d 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart01.java @@ -100,7 +100,7 @@ public class RealtimeChart01 implements ExampleChart { return chart; } - private static List<Double> getRandomData(int numPoints) { + private List<Double> getRandomData(int numPoints) { List<Double> data = new ArrayList<Double>(); for (int i = 0; i < numPoints; i++) { diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart03.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart03.java new file mode 100644 index 0000000000000000000000000000000000000000..127c9d78245bc553c0fe6d684c860aa5d6c4b0af --- /dev/null +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/realtime/RealtimeChart03.java @@ -0,0 +1,143 @@ +/** + * 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.demo.charts.realtime; + +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +import javax.swing.JFrame; + +import com.xeiam.xchart.Chart; +import com.xeiam.xchart.XChartPanel; +import com.xeiam.xchart.demo.charts.ExampleChart; + +/** + * Realtime + * <p> + * Demonstrates the following: + * <ul> + * <li>real-time chart updates + * <li>fixed window + * <li>error bars + */ +public class RealtimeChart03 implements ExampleChart { + + private List<Integer> xData = new ArrayList<Integer>(); + private List<Double> yData = new ArrayList<Double>(); + private List<Double> errorBars = new ArrayList<Double>(); + + public static final String SERIES_NAME = "series1"; + + public static void main(String[] args) { + + // Setup the panel + final RealtimeChart03 realtimeChart03 = new RealtimeChart03(); + final XChartPanel chartPanel = realtimeChart03.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(chartPanel); + + // Display the window. + frame.pack(); + frame.setVisible(true); + } + }); + + // Simulate a data feed + TimerTask chartUpdaterTask = new TimerTask() { + + @Override + public void run() { + + realtimeChart03.updateData(); + chartPanel.updateSeries(SERIES_NAME, realtimeChart03.xData, realtimeChart03.getyData(), realtimeChart03.errorBars); + + } + }; + + Timer timer = new Timer(); + timer.scheduleAtFixedRate(chartUpdaterTask, 0, 500); + + } + + public XChartPanel buildPanel() { + + return new XChartPanel(getChart()); + } + + @Override + public Chart getChart() { + + yData.add(0.0); + for (int i = 0; i < 50; i++) { + double lastPoint = yData.get(yData.size() - 1); + yData.add(getRandomWalk(lastPoint)); + } + // generate X-Data + xData = new ArrayList<Integer>(); + for (int i = 1; i < yData.size() + 1; i++) { + xData.add(i); + } + // generate error bars + errorBars = new ArrayList<Double>(); + for (int i = 0; i < yData.size(); i++) { + errorBars.add(20 * Math.random()); + } + + // Create Chart + Chart chart = new Chart(500, 400); + chart.setChartTitle("Sample Real-time Chart"); + chart.setXAxisTitle("X"); + chart.setYAxisTitle("Y"); + chart.addSeries(SERIES_NAME, xData, yData, errorBars); + + return chart; + } + + private Double getRandomWalk(double lastPoint) { + + return lastPoint + (Math.random() * 100 - 50); + } + + public void updateData() { + + // Get some new data + double lastPoint = yData.get(yData.size() - 1); + yData.add(getRandomWalk(lastPoint)); + yData.remove(0); + + // update error bars + errorBars.add(20 * Math.random()); + errorBars.remove(0); + + } + + public List<Double> getyData() { + + return yData; + } +} diff --git a/xchart/src/main/java/com/xeiam/xchart/Series.java b/xchart/src/main/java/com/xeiam/xchart/Series.java index 3b0c2acb6b3af05c842a6bc8e68227156d1a8ad1..254bcbad413c7cc2dc28439a4de1896ebc1d8fea 100644 --- a/xchart/src/main/java/com/xeiam/xchart/Series.java +++ b/xchart/src/main/java/com/xeiam/xchart/Series.java @@ -313,6 +313,12 @@ public class Series { calculateMinMax(); } + public void replaceErrroBarData(Collection<? extends Number> newErrorBars) { + + errorBars = newErrorBars; + calculateMinMax(); + } + private void calculateMinMax() { // xData diff --git a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java index adc5a01943c1887913695e36eb83056509a71e52..f9795f15c07b2306f1aa07b4d7fe0fbbdf2b53ab 100644 --- a/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java +++ b/xchart/src/main/java/com/xeiam/xchart/XChartPanel.java @@ -353,4 +353,30 @@ public class XChartPanel extends JPanel { return series; } + + /** + * update a series by updating the X-Axis, Y-Axis and error bar data + * + * @param seriesName + * @param newXData + * @param newYData + * @param newErrorBarData + * @return + */ + public Series updateSeries(String seriesName, Collection<?> newXData, List<? extends Number> newYData, List<? extends Number> newErrorBarData) { + + Series series = chart.getSeriesMap().get(seriesName); + if (series == null) { + throw new IllegalArgumentException("Series name >" + seriesName + "< not found!!!"); + } + series.replaceXData(newXData); + series.replaceYData(newYData); + series.replaceErrroBarData(newErrorBarData); + + // Re-display the chart + revalidate(); + repaint(); + + return series; + } } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/NumberFormatter.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/NumberFormatter.java index d58db61a83729dd18ef060691eedb96412969b90..0f98c812bd67fcba483f2459681971d3b0082623 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/NumberFormatter.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/NumberFormatter.java @@ -37,9 +37,9 @@ public class NumberFormatter { public String getFormatPattern(double value, double min, double max) { - System.out.println("value: " + value); - System.out.println("min: " + min); - System.out.println("max: " + max); + // System.out.println("value: " + value); + // System.out.println("min: " + min); + // System.out.println("max: " + max); double difference = max - min; int placeOfDifference; @@ -57,9 +57,9 @@ public class NumberFormatter { placeOfValue = (int) Math.floor(Math.log(value) / Math.log(10)); } - System.out.println("difference: " + difference); - System.out.println("placeOfDifference: " + placeOfDifference); - System.out.println("placeOfValue: " + placeOfValue); + // System.out.println("difference: " + difference); + // System.out.println("placeOfDifference: " + placeOfDifference); + // System.out.println("placeOfValue: " + placeOfValue); if (placeOfDifference <= 4 && placeOfDifference >= -4) { // System.out.println("getNormalDecimalPattern"); @@ -93,7 +93,7 @@ public class NumberFormatter { sb.append("."); } } - System.out.println(sb.toString()); + // System.out.println(sb.toString()); return sb.toString(); }