java - Real time area chart application -



java - Real time area chart application -

i have take next code stackoverflow, when application started running, dynamically area chart updating, after few seconds application hanging (i.e minimize, maximize, close buttons window not working after increasing window size). area chart updating.

package areachartsample; import java.util.concurrent.concurrentlinkedqueue; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concurrent.threadfactory; import java.util.logging.level; import java.util.logging.logger; import javafx.animation.animationtimer; import javafx.animation.timeline; import javafx.application.application; import javafx.scene.scene; import javafx.scene.chart.areachart; import javafx.scene.chart.numberaxis; import javafx.scene.chart.xychart.data; import javafx.scene.chart.xychart.series; import javafx.stage.stage; public class areachartsample extends application { private static final int max_data_points = 50; private series series; private int xseriesdata = 0; private concurrentlinkedqueue<number> dataq = new concurrentlinkedqueue<number>(); private executorservice executor; private addtoqueue addtoqueue; private timeline timeline2; private numberaxis xaxis; private void init(stage primarystage) { xaxis = new numberaxis(0,max_data_points,max_data_points/10); xaxis.setforcezeroinrange(false); xaxis.setautoranging(false); numberaxis yaxis = new numberaxis(); yaxis.setautoranging(true); //-- chart final areachart<number, number> sc = new areachart<number, number>(xaxis, yaxis) { // override remove symbols on each info point @override protected void dataitemadded(series<number, number> series, int itemindex, data<number, number> item) {} }; sc.setanimated(false); sc.setid("liveareachart"); sc.settitle("animated area chart"); //-- chart series series = new areachart.series<number, number>(); series.setname("area chart series"); sc.getdata().add(series); primarystage.setscene(new scene(sc)); } @override public void start(stage primarystage) throws exception { init(primarystage); primarystage.show(); //-- prepare executor services executor = executors.newcachedthreadpool(new threadfactory() { @override public thread newthread(runnable r) { thread thread = new thread(r); thread.setdaemon(true); homecoming thread; } }); addtoqueue = new addtoqueue(); executor.execute(addtoqueue); //-- prepare timeline preparetimeline(); } public static void main(string[] args) { launch(args); } private class addtoqueue implements runnable { public void run() { seek { // add together item of random info queue dataq.add(math.random()); thread.sleep(50); executor.execute(this); } grab (interruptedexception ex) { logger.getlogger(areachartsample.class.getname()).log(level.severe, null, ex); } } } //-- timeline gets called in javafx main thread private void preparetimeline() { // every frame take info queue , add together chart new animationtimer() { @override public void handle(long now) { adddatatoseries(); } }.start(); } private void adddatatoseries() { (int = 0; < 20; i++) { //-- add together 20 numbers plot+ if (dataq.isempty()) break; series.getdata().add(new areachart.data(xseriesdata++, dataq.remove())); } // remove points maintain @ no more max_data_points if (series.getdata().size() > max_data_points) { series.getdata().remove(0, series.getdata().size() - max_data_points); } // update xaxis.setlowerbound(xseriesdata-max_data_points); xaxis.setupperbound(xseriesdata-1); } }

i created illustration you. uses timeline chart update.

import java.util.list; import java.util.random; import javafx.animation.animation; import javafx.animation.keyframe; import javafx.animation.sequentialtransition; import javafx.animation.timeline; import javafx.application.application; import javafx.event.actionevent; import javafx.event.eventhandler; import javafx.scene.parent; import javafx.scene.scene; import javafx.scene.chart.areachart; import javafx.scene.chart.numberaxis; import javafx.scene.chart.xychart; import javafx.scene.chart.xychart.data; import javafx.stage.stage; import javafx.util.duration; public class liveareachartapp extends application { private static int max_data_points = 10; private static int y_data_range = 100; private static int tick_unit = 10; private static int update_interval_ms = 100; private areachart.series<number, number> series1; private areachart.series<number, number> series2; private areachart<number, number> areachart; private numberaxis xaxis = new numberaxis(); private numberaxis yaxis = new numberaxis(); private sequentialtransition animation; private double nextx = 0; random rnd = new random(); public liveareachartapp() { timeline timeline = new timeline(); timeline.getkeyframes().add(new keyframe(duration.millis( update_interval_ms), new eventhandler<actionevent>() { @override public void handle(actionevent actionevent) { // update chart info // note add together 1 info point , remove 1 info point in simple example. // in production environment you'd have add together multiple , remove multiple info points // add together new points series1.getdata().add(new xychart.data<number, number>(nextx, math.sin(math.toradians(nextx)) * y_data_range)); series2.getdata().add(new xychart.data<number, number>(nextx, math.cos(math.toradians(nextx)) * y_data_range)); // remove points shouldn't visible anymore if (series1.getdata().size() > max_data_points) { series1.getdata().remove(0); } if (series2.getdata().size() > max_data_points) { series2.getdata().remove(0); } nextx += 10; // update using series 1 reference // series 2 contains same amount of data; if doesn't case, // need adapt here , calculate proper range list<data<number, number>> info = series1.getdata(); xaxis.setlowerbound(data.get(0).getxvalue().doublevalue()); xaxis.setupperbound(data.get(data.size() - 1).getxvalue().doublevalue()); } })); timeline.setcyclecount(animation.indefinite); animation = new sequentialtransition(); animation.getchildren().addall(timeline); } public parent createcontent() { xaxis = new numberaxis(); xaxis.setforcezeroinrange(false); xaxis.setautoranging(false); xaxis.setticklabelsvisible(false); xaxis.settickmarkvisible(false); xaxis.setminortickvisible(false); yaxis = new numberaxis(-y_data_range, y_data_range, tick_unit); yaxis.setautoranging(false); areachart = new areachart<>(xaxis, yaxis); areachart.setanimated(false); areachart.setlegendvisible(false); series1 = new areachart.series<>(); series1.getdata().add(new areachart.data<number, number>(0d, 0d)); areachart.getdata().add(series1); series2 = new areachart.series<>(); series2.getdata().add(new areachart.data<number, number>(0d, 0d)); areachart.getdata().add(series2); homecoming areachart; } public void play() { animation.play(); } @override public void stop() { animation.pause(); } @override public void start(stage primarystage) throws exception { primarystage.setscene(new scene(createcontent())); primarystage.show(); play(); } public static void main(string[] args) { launch(args); } }

java netbeans javafx

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -