如何在散点图上拖放
How to drag'n'drop on a scatter chart
我有一个散点图,我希望能够移动点,拖动它们
问题是它不像 canvas,我显然不能使用 eventgetX()
或 getSceneX()
,因为有轴,根据轴的大小,它们不在同一位置场景,所以 0/0
显然没有根据图表设置,如果我改变场景的大小,距离:border/axis 也会改变
相关代码:
<ScatterChart fx:id="chart" onDragDetected="#chartDragDetected"
在 .fxml 中
和:
//The method associated with the chart
@FXML
void chartDragDetected(MouseEvent event) {
//Lots of try to find the coordinate but they change
//depending of the size of the scene
}
.
//in the initialize, populating the chart
double res=0;
for (double x = fct.getInf(); x<=fct.getSup(); x+=0.05 ){ //precision of graph
res = fct.f_de_x(x);
Data<Number,Number> dt = new Data<Number, Number>(x, res);
series.getData().add(dt);
}
chart.getData().add(series);
在控制器中
因此,发布答案中的代码,如果它可能每天对某人有用的话:
在我的控制器的初始化方法中:
chart.getData().get(0).getData().forEach(data->new DnDToMoveData(data));
所以 DnDtoMoveData 是一名实习生 class,这就是它的样子:
public class DnDToMoveData{
double pressPositionX;
double pressPositionY;
DnDToMoveData(Data<Number, Number> data){
data.getNode().setOnMousePressed(event->{
pressPositionX = event.getSceneX();
pressPositionY = chart.getHeight()-event.getSceneY();
});
data.getNode().setOnMouseDragged(event->{
data.setXValue(data.getXValue().doubleValue()+event.getSceneX())
this.pressPositionX);
data.setYValue(data.getYValue().doubleValue()+event.getSceneY())-this.pressPositionY);
pressPositionX = event.getSceneX();
pressPositionY = chart.getHeight()-event.getSceneY();
});
}
}
所以我实现了2个方法,onClick获取事件的起点,然后根据事件的位置移动点
有一些改进要做,因为事件的像素距离与图表的比例不匹配,所以它会做坏事,但实际上它有效
我有一个散点图,我希望能够移动点,拖动它们
问题是它不像 canvas,我显然不能使用 eventgetX()
或 getSceneX()
,因为有轴,根据轴的大小,它们不在同一位置场景,所以 0/0
显然没有根据图表设置,如果我改变场景的大小,距离:border/axis 也会改变
相关代码:
<ScatterChart fx:id="chart" onDragDetected="#chartDragDetected"
在 .fxml 中
和:
//The method associated with the chart
@FXML
void chartDragDetected(MouseEvent event) {
//Lots of try to find the coordinate but they change
//depending of the size of the scene
}
.
//in the initialize, populating the chart
double res=0;
for (double x = fct.getInf(); x<=fct.getSup(); x+=0.05 ){ //precision of graph
res = fct.f_de_x(x);
Data<Number,Number> dt = new Data<Number, Number>(x, res);
series.getData().add(dt);
}
chart.getData().add(series);
在控制器中
因此,发布答案中的代码,如果它可能每天对某人有用的话: 在我的控制器的初始化方法中:
chart.getData().get(0).getData().forEach(data->new DnDToMoveData(data));
所以 DnDtoMoveData 是一名实习生 class,这就是它的样子:
public class DnDToMoveData{
double pressPositionX;
double pressPositionY;
DnDToMoveData(Data<Number, Number> data){
data.getNode().setOnMousePressed(event->{
pressPositionX = event.getSceneX();
pressPositionY = chart.getHeight()-event.getSceneY();
});
data.getNode().setOnMouseDragged(event->{
data.setXValue(data.getXValue().doubleValue()+event.getSceneX())
this.pressPositionX);
data.setYValue(data.getYValue().doubleValue()+event.getSceneY())-this.pressPositionY);
pressPositionX = event.getSceneX();
pressPositionY = chart.getHeight()-event.getSceneY();
});
}
}
所以我实现了2个方法,onClick获取事件的起点,然后根据事件的位置移动点 有一些改进要做,因为事件的像素距离与图表的比例不匹配,所以它会做坏事,但实际上它有效