Skip to content
Snippets Groups Projects
Commit b1d341b2 authored by Tim Molter's avatar Tim Molter
Browse files

allow real-time update from SwingWrapper, add simple demo, allow updating of double[] data

parent ebdfdccc
No related branches found
No related tags found
No related merge requests found
Showing
with 178 additions and 66 deletions
......@@ -165,7 +165,7 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
public void run() {
realtimeChart01.updateData();
chartPanel.updateSeries(RealtimeChart01.SERIES_NAME, null, realtimeChart01.getyData(), null);
chartPanel.updateXYSeries(RealtimeChart01.SERIES_NAME, null, realtimeChart01.getyData(), null);
}
};
timer = new Timer();
......@@ -179,7 +179,7 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
public void run() {
realtimeChart02.updateData();
chartPanel.updateSeries(RealtimeChart02.SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData(), null);
chartPanel.updateXYSeries(RealtimeChart02.SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData(), null);
}
};
timer = new Timer();
......@@ -193,7 +193,7 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
public void run() {
realtimeChart03.updateData();
chartPanel.updateSeries(RealtimeChart02.SERIES_NAME, null, realtimeChart03.getyData(), realtimeChart03.getErrorBars());
chartPanel.updateXYSeries(RealtimeChart02.SERIES_NAME, null, realtimeChart03.getyData(), realtimeChart03.getErrorBars());
}
};
timer = new Timer();
......@@ -207,7 +207,7 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
public void run() {
realtimeChart04.updateData();
chartPanel.updateSeries(RealtimeChart02.SERIES_NAME, null, realtimeChart04.getyData(), realtimeChart04.getbubbleData());
chartPanel.updateXYSeries(RealtimeChart02.SERIES_NAME, null, realtimeChart04.getyData(), realtimeChart04.getbubbleData());
}
};
timer = new Timer();
......
......@@ -71,7 +71,7 @@ public class RealtimeChart01 implements ExampleChart<XYChart> {
public void run() {
realtimeChart01.updateData();
chartPanel.updateSeries(SERIES_NAME, null, realtimeChart01.getyData(), null);
chartPanel.updateXYSeries(SERIES_NAME, null, realtimeChart01.getyData(), null);
}
};
......
......@@ -72,7 +72,7 @@ public class RealtimeChart02 implements ExampleChart<XYChart> {
public void run() {
realtimeChart02.updateData();
chartPanel.updateSeries(SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData(), null);
chartPanel.updateXYSeries(SERIES_NAME, realtimeChart02.getxData(), realtimeChart02.getyData(), null);
}
};
......
......@@ -76,7 +76,7 @@ public class RealtimeChart03 implements ExampleChart<XYChart> {
public void run() {
realtimeChart03.updateData();
chartPanel.updateSeries(SERIES_NAME, realtimeChart03.xData, realtimeChart03.getyData(), realtimeChart03.errorBars);
chartPanel.updateXYSeries(SERIES_NAME, realtimeChart03.xData, realtimeChart03.getyData(), realtimeChart03.errorBars);
}
};
......
......@@ -75,7 +75,7 @@ public class RealtimeChart04 implements ExampleChart<BubbleChart> {
public void run() {
realtimeChart04.updateData();
chartPanel.updateSeries(SERIES_NAME, null, realtimeChart04.getyData(), realtimeChart04.getbubbleData());
chartPanel.updateXYSeries(SERIES_NAME, null, realtimeChart04.getyData(), realtimeChart04.getbubbleData());
}
};
......
/**
* Copyright 2015-2016 Knowm Inc. (http://knowm.org) and contributors.
* Copyright 2011-2015 Xeiam LLC (http://xeiam.com) and contributors.
*
* 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 org.knowm.xchart.standalone;
import java.util.ArrayList;
import java.util.List;
import org.knowm.xchart.QuickChart;
import org.knowm.xchart.SwingWrapper;
import org.knowm.xchart.XYChart;
/**
* Creates a simple real-time Chart using QuickChart
*/
public class SimpleRealTime {
public static void main(String[] args) throws Exception {
double[] xData = new double[] { 0.0, 1.0, 2.0 };
double[] yData = new double[] { 2.0, 1.0, 0.0 };
// Create Chart
XYChart chart = QuickChart.getChart("Sample Chart", "X", "Y", "y(x)", xData, yData);
// Show it
final SwingWrapper<XYChart> sw = new SwingWrapper(chart);
sw.displayChart();
for (int i = 0; i < 1000; i++) {
Thread.sleep(100);
final List<Double> data = new ArrayList<Double>(3);
data.add(yData[0] + i);
data.add(yData[1] + i);
data.add(yData[2] + i);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
sw.getXChartPanel().updateXYSeries("y(x)", null, data, null);
}
});
}
}
}
......@@ -24,6 +24,7 @@ import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.util.List;
import org.knowm.xchart.internal.Utils;
import org.knowm.xchart.internal.chartpart.AxisPair;
import org.knowm.xchart.internal.chartpart.Chart;
import org.knowm.xchart.internal.chartpart.Legend_Bubble;
......@@ -100,7 +101,7 @@ public class BubbleChart extends Chart<BubbleStyler, BubbleSeries> {
*/
public BubbleSeries addSeries(String seriesName, double[] xData, double[] yData, double[] bubbleData) {
return addSeries(seriesName, getNumberListFromDoubleArray(xData), getNumberListFromDoubleArray(yData), getNumberListFromDoubleArray(bubbleData));
return addSeries(seriesName, Utils.getNumberListFromDoubleArray(xData), Utils.getNumberListFromDoubleArray(yData), Utils.getNumberListFromDoubleArray(bubbleData));
}
/**
......@@ -129,7 +130,7 @@ public class BubbleChart extends Chart<BubbleStyler, BubbleSeries> {
series = new BubbleSeries(seriesName, xData, yData, bubbleData);
}
else { // generate xData
series = new BubbleSeries(seriesName, getGeneratedData(yData.size()), yData, bubbleData);
series = new BubbleSeries(seriesName, Utils.getGeneratedData(yData.size()), yData, bubbleData);
}
seriesMap.put(seriesName, series);
......
......@@ -22,6 +22,7 @@ import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.util.List;
import org.knowm.xchart.internal.Utils;
import org.knowm.xchart.internal.chartpart.AxisPair;
import org.knowm.xchart.internal.chartpart.Chart;
import org.knowm.xchart.internal.chartpart.Legend_Marker;
......@@ -113,7 +114,7 @@ public class CategoryChart extends Chart<CategoryStyler, CategorySeries> {
*/
public CategorySeries addSeries(String seriesName, double[] xData, double[] yData, double[] errorBars) {
return addSeries(seriesName, getNumberListFromDoubleArray(xData), getNumberListFromDoubleArray(yData), getNumberListFromDoubleArray(errorBars));
return addSeries(seriesName, Utils.getNumberListFromDoubleArray(xData), Utils.getNumberListFromDoubleArray(yData), Utils.getNumberListFromDoubleArray(errorBars));
}
/**
......@@ -140,7 +141,7 @@ public class CategoryChart extends Chart<CategoryStyler, CategorySeries> {
*/
public CategorySeries addSeries(String seriesName, int[] xData, int[] yData, int[] errorBars) {
return addSeries(seriesName, getNumberListFromIntArray(xData), getNumberListFromIntArray(yData), getNumberListFromIntArray(errorBars));
return addSeries(seriesName, Utils.getNumberListFromIntArray(xData), Utils.getNumberListFromIntArray(yData), Utils.getNumberListFromIntArray(errorBars));
}
/**
......@@ -183,7 +184,7 @@ public class CategoryChart extends Chart<CategoryStyler, CategorySeries> {
series = new CategorySeries(seriesName, xData, yData, errorBars);
}
else { // generate xData
series = new CategorySeries(seriesName, getGeneratedData(yData.size()), yData, errorBars);
series = new CategorySeries(seriesName, Utils.getGeneratedData(yData.size()), yData, errorBars);
}
seriesMap.put(seriesName, series);
......
......@@ -35,6 +35,7 @@ public class SwingWrapper<T extends Chart> {
private String windowTitle = "XChart";
private List<T> charts = new ArrayList<T>();
private List<XChartPanel<T>> chartPanels = new ArrayList<XChartPanel<T>>();
private int numRows;
private int numColumns;
......@@ -103,7 +104,8 @@ public class SwingWrapper<T extends Chart> {
public void run() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel chartPanel = new XChartPanel<T>(charts.get(0));
XChartPanel<T> chartPanel = new XChartPanel<T>(charts.get(0));
chartPanels.add(chartPanel);
frame.add(chartPanel);
// Display the window.
......@@ -148,7 +150,8 @@ public class SwingWrapper<T extends Chart> {
for (T chart : charts) {
if (chart != null) {
JPanel chartPanel = new XChartPanel<T>(chart);
XChartPanel<T> chartPanel = new XChartPanel<T>(chart);
chartPanels.add(chartPanel);
frame.add(chartPanel);
}
else {
......@@ -167,4 +170,24 @@ public class SwingWrapper<T extends Chart> {
return frame;
}
/**
* Get the default XChartPanel. This is the only one for single panel chart displays and the first panel in matrix chart displays
*
* @return
*/
public XChartPanel<T> getXChartPanel() {
return chartPanels.get(0);
}
/**
* Get the XChartPanel given the provided index.
*
* @param index
* @return
*/
public XChartPanel<T> getXChartPanel(int index) {
return chartPanels.get(index);
}
}
......@@ -41,7 +41,7 @@ import javax.swing.filechooser.FileFilter;
import org.knowm.xchart.BitmapEncoder.BitmapFormat;
import org.knowm.xchart.VectorGraphicsEncoder.VectorGraphicsFormat;
import org.knowm.xchart.internal.Series_AxesChart;
import org.knowm.xchart.internal.Utils;
import org.knowm.xchart.internal.chartpart.Chart;
/**
......@@ -292,10 +292,10 @@ public class XChartPanel<T extends Chart> extends JPanel {
* @param newErrorBarData - set null if there are no error bars
* @return
*/
public Series_AxesChart updateSeries(String seriesName, List<?> newXData, List<? extends Number> newYData, List<? extends Number> newErrorBarData) {
public XYSeries updateXYSeries(String seriesName, List<?> newXData, List<? extends Number> newYData, List<? extends Number> newErrorBarData) {
Map<String, Series_AxesChart> seriesMap = chart.getSeriesMap();
Series_AxesChart series = seriesMap.get(seriesName);
Map<String, XYSeries> seriesMap = chart.getSeriesMap();
XYSeries series = seriesMap.get(seriesName);
if (series == null) {
throw new IllegalArgumentException("Series name >" + seriesName + "< not found!!!");
}
......@@ -318,4 +318,19 @@ public class XChartPanel<T extends Chart> extends JPanel {
return series;
}
/**
* Update a series by updating the X-Axis, Y-Axis and error bar data
*
* @param seriesName
* @param newXData - set null to be automatically generated as a list of increasing Integers starting from
* 1 and ending at the size of the new Y-Axis data list.
* @param newYData
* @param newErrorBarData - set null if there are no error bars
* @return
*/
public XYSeries updateXYSeriesString(String seriesName, double[] newXData, double[] newYData, double[] newErrorBarData) {
return updateXYSeries(seriesName, Utils.getNumberListFromDoubleArray(newXData), Utils.getNumberListFromDoubleArray(newYData), Utils.getNumberListFromDoubleArray(newErrorBarData));
}
}
......@@ -22,6 +22,7 @@ import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.util.List;
import org.knowm.xchart.internal.Utils;
import org.knowm.xchart.internal.chartpart.AxisPair;
import org.knowm.xchart.internal.chartpart.Chart;
import org.knowm.xchart.internal.chartpart.Legend_Marker;
......@@ -126,7 +127,7 @@ public class XYChart extends Chart<XYStyler, XYSeries> {
*/
public XYSeries addSeries(String seriesName, double[] xData, double[] yData, double[] errorBars) {
return addSeries(seriesName, getNumberListFromDoubleArray(xData), getNumberListFromDoubleArray(yData), getNumberListFromDoubleArray(errorBars));
return addSeries(seriesName, Utils.getNumberListFromDoubleArray(xData), Utils.getNumberListFromDoubleArray(yData), Utils.getNumberListFromDoubleArray(errorBars));
}
/**
......@@ -153,7 +154,7 @@ public class XYChart extends Chart<XYStyler, XYSeries> {
*/
public XYSeries addSeries(String seriesName, int[] xData, int[] yData, int[] errorBars) {
return addSeries(seriesName, getNumberListFromIntArray(xData), getNumberListFromIntArray(yData), getNumberListFromIntArray(errorBars));
return addSeries(seriesName, Utils.getNumberListFromIntArray(xData), Utils.getNumberListFromIntArray(yData), Utils.getNumberListFromIntArray(errorBars));
}
/**
......@@ -181,7 +182,7 @@ public class XYChart extends Chart<XYStyler, XYSeries> {
series = new XYSeries(seriesName, xData, yData, errorBars);
}
else { // generate xData
series = new XYSeries(seriesName, getGeneratedData(yData.size()), yData, errorBars);
series = new XYSeries(seriesName, Utils.getGeneratedData(yData.size()), yData, errorBars);
}
seriesMap.put(seriesName, series);
......
......@@ -86,6 +86,13 @@ public abstract class Series_AxesChart extends Series {
calculateMinMax();
}
/**
* This is an internal method which shouldn't be called from client code. Use XChartPanel.updateXYSeries instead!
*
* @param newXData
* @param newYData
* @param newExtraValues
*/
public void replaceData(List<?> newXData, List<? extends Number> newYData, List<? extends Number> newExtraValues) {
// Sanity check
......
......@@ -16,6 +16,9 @@
*/
package org.knowm.xchart.internal;
import java.util.ArrayList;
import java.util.List;
/**
* @author timmolter
*/
......@@ -30,7 +33,7 @@ public class Utils {
/**
* Gets the offset for the beginning of the tick marks
*
*
* @param workingSpace
* @param tickSpace
* @return
......@@ -52,4 +55,44 @@ public class Utils {
}
}
public static List<Double> getNumberListFromDoubleArray(double[] data) {
if (data == null) {
return null;
}
List<Double> dataNumber = null;
if (data != null) {
dataNumber = new ArrayList<Double>();
for (double d : data) {
dataNumber.add(new Double(d));
}
}
return dataNumber;
}
public static List<Double> getNumberListFromIntArray(int[] data) {
if (data == null) {
return null;
}
List<Double> dataNumber = null;
if (data != null) {
dataNumber = new ArrayList<Double>();
for (double d : data) {
dataNumber.add(new Double(d));
}
}
return dataNumber;
}
public static List<Double> getGeneratedData(int length) {
List<Double> generatedData = new ArrayList<Double>();
for (int i = 1; i < length + 1; i++) {
generatedData.add((double) i);
}
return generatedData;
}
}
......@@ -18,9 +18,7 @@ package org.knowm.xchart.internal.chartpart;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.knowm.xchart.internal.Series;
......@@ -68,47 +66,6 @@ public abstract class Chart<ST extends Styler, S extends Series> implements Char
this.chartTitle = new ChartTitle(this);
}
public List<Double> getNumberListFromDoubleArray(double[] data) {
if (data == null) {
return null;
}
List<Double> dataNumber = null;
if (data != null) {
dataNumber = new ArrayList<Double>();
for (double d : data) {
dataNumber.add(new Double(d));
}
}
return dataNumber;
}
public List<Double> getNumberListFromIntArray(int[] data) {
if (data == null) {
return null;
}
List<Double> dataNumber = null;
if (data != null) {
dataNumber = new ArrayList<Double>();
for (double d : data) {
dataNumber.add(new Double(d));
}
}
return dataNumber;
}
public List<Double> getGeneratedData(int length) {
List<Double> generatedData = new ArrayList<Double>();
for (int i = 1; i < length + 1; i++) {
generatedData.add((double) i);
}
return generatedData;
}
/** Meta Data Getters and Setters */
public int getWidth() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment