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
Post a Comment