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