java - Move and set the value of a XYChart.Data node in line chart -


i want have interactive line chart allows me move , set underlying value of points on chart. adding mouse event ondragged handler nodes of xychart.data points should allow me this, need able translate mouse event position axis frame of reference of point. using following;

xaxis.getvaluefordisplay(event.getx()).doublevalue(); 

where xaxis number axis of line chart not work on mouse events applied xychart.data points (it when use approach on node of chart background). below code;

package com.jtech;  import javafx.application.application; import javafx.event.eventhandler; import javafx.scene.node; import javafx.scene.scene; import javafx.scene.chart.axis; import javafx.scene.chart.linechart; import javafx.scene.chart.numberaxis; import javafx.scene.chart.xychart; import javafx.scene.input.mouseevent; import javafx.stage.stage;  public class movepoint extends application {      class mousehandler implements eventhandler<mouseevent> {         private xychart.data data;         private axis<number> xaxis, yaxis;          public mousehandler(xychart.data data, axis<number> xaxis, axis<number> yaxis) {             this.data=data;             this.xaxis=xaxis;             this.yaxis=yaxis;         }          @override         public void handle(mouseevent event) {             //we want these in axis coordinate frame             double x =  xaxis.getvaluefordisplay(event.getx()).doublevalue();             double y =  yaxis.getvaluefordisplay(event.gety()).doublevalue();              if (event.geteventtype() == mouseevent.mouse_dragged) {                 system.out.println(string.format("(%.2f,%.2f)",x,y));                 //data.setxvalue(x);                 //data.setyvalue(y);             }         }     }      @override     public void start(stage stage) {         final numberaxis xaxis = new numberaxis(0,6,1);         final numberaxis yaxis = new numberaxis(0,10,2);          final linechart<number, number> linechart = new linechart<>(xaxis, yaxis);         linechart.settitle("point moving example");         xychart.series series = new xychart.series();          final xychart.data d1 = new xychart.data(0.0, 0.0);         final xychart.data d2 = new xychart.data(0.5, 2.0);         final xychart.data d3 = new xychart.data(2.0, 2.5);         final xychart.data d4 = new xychart.data(3.5, 3.5);         final xychart.data d5 = new xychart.data(5.0, 8.0);          series.getdata().addall(d1,d2,d3,d4,d5);         linechart.getdata().add(series);         linechart.setlegendvisible(false);          final scene scene = new scene(linechart, 400, 300);         stage.setscene(scene);         stage.show();          registernode(d1,xaxis, yaxis);         registernode(d2,xaxis, yaxis);         registernode(d3,xaxis, yaxis);         registernode(d4,xaxis, yaxis);         registernode(d5,xaxis, yaxis);     }      private void registernode(xychart.data data, axis<number> xaxis, axis<number> yaxis) {         final node node = data.getnode();         node.setonmousedragged(new mousehandler(data,xaxis,yaxis));     }      public static void main(string[] args) {         launch(args);     } }   

what correct approach achieving this? i've seen examples translate actual node, curious know if setting actual x,y values of data directly.

this seems possible:

import javafx.application.application; import javafx.application.platform; import javafx.geometry.point2d; import javafx.scene.cursor; import javafx.scene.node; import javafx.scene.scene; import javafx.scene.chart.linechart; import javafx.scene.chart.numberaxis; import javafx.scene.chart.xychart; import javafx.scene.chart.xychart.data; import javafx.scene.control.button; import javafx.scene.layout.borderpane; import javafx.stage.stage;  public class dragginglinechartsample extends application {      @override     public void start(stage primarystage) {         primarystage.settitle("line chart sample");         //defining axes         final numberaxis xaxis = new numberaxis(0, 12, 1);         final numberaxis yaxis = new numberaxis(0, 50, 5);         xaxis.setlabel("number of month");         //creating chart         final linechart<number,number> linechart =                  new linechart<number,number>(xaxis,yaxis);          linechart.settitle("stock monitoring, 2010");          linechart.setanimated(false);          //defining series         xychart.series<number, number> series = new xychart.series<>();         series.setname("my portfolio");         //populating series data         series.getdata().add(new xychart.data<>(1, 23));         series.getdata().add(new xychart.data<>(2, 14));         series.getdata().add(new xychart.data<>(3, 15));         series.getdata().add(new xychart.data<>(4, 24));         series.getdata().add(new xychart.data<>(5, 34));         series.getdata().add(new xychart.data<>(6, 36));         series.getdata().add(new xychart.data<>(7, 22));         series.getdata().add(new xychart.data<>(8, 45));         series.getdata().add(new xychart.data<>(9, 43));         series.getdata().add(new xychart.data<>(10, 17));         series.getdata().add(new xychart.data<>(11, 29));         series.getdata().add(new xychart.data<>(12, 25));                  scene scene  = new scene(new borderpane(linechart),800,600);         linechart.getdata().add(series);          (data<number, number> data : series.getdata()) {             node node = data.getnode() ;             node.setcursor(cursor.hand);             node.setonmousedragged(e -> {                 point2d pointinscene = new point2d(e.getscenex(), e.getsceney());                 double xaxisloc = xaxis.scenetolocal(pointinscene).getx();                 double yaxisloc = yaxis.scenetolocal(pointinscene).gety();                 number x = xaxis.getvaluefordisplay(xaxisloc);                 number y = yaxis.getvaluefordisplay(yaxisloc);                 data.setxvalue(x);                 data.setyvalue(y);             });         }           primarystage.setscene(scene);         primarystage.show();     }      public static void main(string[] args) {         launch(args);     } } 

Comments