javafx - Clear only the visible data data from Chart -


i have example of javafx linechart. reset data chart.

public class mainapp extends application {     private static final int max_data_points = 50;      private series series;     private int xseriesdata = 0;     private final concurrentlinkedqueue<number> dataq = new concurrentlinkedqueue<>();     private executorservice executor;     private addtoqueue addtoqueue;     private timeline timeline2;     private numberaxis xaxis;     private numberaxis yaxis;     private areachart<number, number> sc;      private void init(stage primarystage)     {             xaxis = new numberaxis(0, max_data_points, max_data_points / 10);         xaxis.setforcezeroinrange(false);         xaxis.setautoranging(false);          yaxis = new numberaxis();         yaxis.setautoranging(true);          sc = new areachart<number, number>(xaxis, yaxis);          sc.setanimated(false);         sc.setid("liveareachart");         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();          executor = executors.newcachedthreadpool(new threadfactory()         {             @override             public thread newthread(runnable r)             {                 thread thread = new thread(r);                 thread.setdaemon(true);                 return thread;             }         });         addtoqueue = new addtoqueue();         executor.execute(addtoqueue);         preparetimeline();     }      public static void main(string[] args)     {         launch(args);     }      private class addtoqueue implements runnable     {         @override         public void run()         {             try             {                 dataq.add(math.random());                 thread.sleep(50);                 executor.execute(this);             }             catch (interruptedexception ex)             {                 logger.getlogger(mainapp.class.getname()).log(level.severe, null, ex);             }         }     }      private void preparetimeline()     {         new animationtimer()         {             @override             public void handle(long now)             {                 adddatatoseries();             }         }.start();     }      private void adddatatoseries()     {         (int = 0; < 20; i++)         { //-- add 20 numbers plot+             if (dataq.isempty())                 break;             series.getdata().add(new areachart.data(xseriesdata++, dataq.remove()));         }          if (series.getdata().size() > max_data_points)         {             series.getdata().remove(0, series.getdata().size() - max_data_points);         }         xaxis.setlowerbound(xseriesdata - max_data_points);         xaxis.setupperbound(xseriesdata - 1);     } } 

what proper way implement this?

i suppose have clear chart's buffer can't find proper solution.

i tested use sc.getdata().clear(); code clears data. clear visible data.

you use flag indicate wish clear data. in thread either update data depending on flag or clear them.

quick example "clear" button , mentioned flag:

public class mainapp extends application {     private static final int max_data_points = 50;      private series series;     private int xseriesdata = 0;     private final concurrentlinkedqueue<number> dataq = new concurrentlinkedqueue<>();     private executorservice executor;     private addtoqueue addtoqueue;     private timeline timeline2;     private numberaxis xaxis;     private numberaxis yaxis;     private areachart<number, number> sc;     private boolean clearflag = false;      private void init(stage primarystage)     {             borderpane bp = new borderpane();          xaxis = new numberaxis(0, max_data_points, max_data_points / 10);         xaxis.setforcezeroinrange(false);         xaxis.setautoranging(false);          yaxis = new numberaxis();         yaxis.setautoranging(true);          sc = new areachart<number, number>(xaxis, yaxis);          sc.setanimated(false);         sc.setid("liveareachart");         series = new areachart.series<number, number>();         series.setname("area chart series");         sc.getdata().add(series);          bp.setcenter(sc);          hbox toolbar = new hbox();         button clearbutton = new button( "clear");         clearbutton.setonaction(e -> {             clearflag = true;         });         toolbar.getchildren().add( clearbutton);          bp.settop(toolbar);          scene scene = new scene(bp, 800, 600);         primarystage.setscene( scene);     }      @override     public void start(stage primarystage) throws exception     {         init(primarystage);         primarystage.show();          executor = executors.newcachedthreadpool(new threadfactory()         {             @override             public thread newthread(runnable r)             {                 thread thread = new thread(r);                 thread.setdaemon(true);                 return thread;             }         });         addtoqueue = new addtoqueue();         executor.execute(addtoqueue);         preparetimeline();     }      public static void main(string[] args)     {         launch(args);     }      private class addtoqueue implements runnable     {         @override         public void run()         {             try             {                 dataq.add(math.random());                 thread.sleep(50);                 executor.execute(this);             }             catch (interruptedexception ex)             { //                logger.getlogger(mainapp.class.getname()).log(level.severe, null, ex);             }         }     }      private void preparetimeline()     {         new animationtimer()         {             @override             public void handle(long now)             {                 if( clearflag) {                     clearchart();                     clearflag = false;                 } else {                     adddatatoseries();                 }             }         }.start();     }      private void clearchart() {         dataq.clear();         series.getdata().clear();     }      private void adddatatoseries()     {         (int = 0; < 20; i++)         { //-- add 20 numbers plot+             if (dataq.isempty())                 break;             series.getdata().add(new areachart.data(xseriesdata++, dataq.remove()));         }          if (series.getdata().size() > max_data_points)         {             series.getdata().remove(0, series.getdata().size() - max_data_points);         }         xaxis.setlowerbound(xseriesdata - max_data_points);         xaxis.setupperbound(xseriesdata - 1);     } } 

and if want clear selected range of data, modify clearchart() , delete range dataq instead of data, let normal chart filling progress.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -