如何在javafx中获取路径中心的坐标?
我得到了如何在javafx中获取路径中心的坐标?,java,javafx,Java,Javafx,我得到了路径元素,它是手动绘制的,并保存为节点。我无法计算如何获取整个节点的中心坐标,因此,如果使用relocate()方法重新定位我的路径,然后决定将其放回原来的位置,它不会返回到初始位置。我尝试过使用getLayoutX()和getLayoutY()方法,但它将我的节点从原始位置进一步上移 我用于重新定位的代码 class PathEventHandler implements EventHandler<MouseEvent>{ //element number in paths
路径
元素,它是手动绘制的,并保存为节点
。我无法计算如何获取整个节点的中心坐标,因此,如果使用relocate()
方法重新定位我的路径
,然后决定将其放回原来的位置,它不会返回到初始位置。我尝试过使用getLayoutX()
和getLayoutY()
方法,但它将我的节点从原始位置进一步上移
我用于重新定位的代码
class PathEventHandler implements EventHandler<MouseEvent>{
//element number in paths
public int n;
public PathEventHandler(int n){
this.n=n;
}
@Override
public void handle(MouseEvent me) {
if (me.getEventType() == MouseEvent.MOUSE_ENTERED) {
paths.get(n).setEffect(new DropShadow(20, Color.BLACK));
}
if (me.getEventType() == MouseEvent.MOUSE_EXITED) {
paths.get(n).setEffect(null);
}
if (i == 2) {
if (me.getEventType() == MouseEvent.MOUSE_DRAGGED) {
listX.add(paths.get(n).getLayoutX());
listY.add(paths.get(n).getLayoutY());
paths.get(n).relocate(me.getSceneX(), me.getSceneY());
cachePath.add(paths.get(n));
cacheType.add("Relocate");
}
if (me.getEventType() == MouseEvent.MOUSE_CLICKED) {
if (me.getButton() == MouseButton.SECONDARY) {
root.getChildren().remove(paths.get(n));
cachePath.add(paths.get(n));
cacheType.add("Remove");
}
}
}
}
}
类PathEventHandler实现EventHandler{
//路径中的元素数
公共int n;
公共PathEventHandler(int n){
这个,n=n;
}
@凌驾
公共无效句柄(MouseEvent me){
如果(me.getEventType()==MouseEvent.MOUSE_){
get(n).setEffect(新的DropShadow(20,Color.BLACK));
}
如果(me.getEventType()==MouseEvent.MOUSE_退出){
path.get(n).setEffect(null);
}
如果(i==2){
if(me.getEventType()==MouseEvent.MOUSE_){
add(path.get(n.getLayoutX());
add(path.get(n.getLayoutY());
path.get(n).relocate(me.getSceneX(),me.getSceneY());
add(path.get(n));
cacheType.add(“重新定位”);
}
如果(me.getEventType()==MouseEvent.MOUSE_单击){
if(me.getButton()==MouseButton.SECONDARY){
root.getChildren().remove(path.get(n));
add(path.get(n));
cacheType.add(“Remove”);
}
}
}
}
}
基于您之前的工作,以及您在本篇文章中几乎没有描述的内容,我试图找出您想要实现的目标
也许离这里很远,但是这段简短但功能性的代码应该足以让您理解如何在同一个鼠标侦听器中处理路径创建(对于第一个问题)和路径移动(对于实际问题)
private Path path;
private double x1, y1;
@Override
public void start(Stage primaryStage) {
AnchorPane root = new AnchorPane();
root.addEventHandler(MouseEvent.ANY, e -> {
if(e.getTarget() instanceof Path){
// Select existing path
Path path1 = (Path)e.getTarget();
if (e.getEventType() == MouseEvent.MOUSE_ENTERED_TARGET) {
path1.setEffect(new DropShadow(20, Color.BLACK));
} else if (e.getEventType() == MouseEvent.MOUSE_EXITED_TARGET) {
path1.setEffect(null);
} else if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
x1=e.getX();
y1=e.getY();
} else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
// traslate path
path1.setTranslateX(e.getX()-x1+path1.getTranslateX());
path1.setTranslateY(e.getY()-y1+path1.getTranslateY());
x1=e.getX();
y1=e.getY();
} else if (e.getButton()==MouseButton.SECONDARY) {
// right-click over the path to move it to its original position
path1.setTranslateX(0);
path1.setTranslateY(0);
}
} else {
// Generate new path
if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
path = new Path();
path.setStroke(Color.BLACK);
path.setStrokeWidth(10);
path.getElements().add(new MoveTo(e.getX(), e.getY()));
root.getChildren().add(path);
} else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED ||
e.getEventType() == MouseEvent.MOUSE_RELEASED) {
path.getElements().add(new LineTo(e.getX(), e.getY()));
}
}
});
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
伟大的这将帮助我了解如何正确存储坐标,或者在需要重新定位对象时添加坐标。然而,可悲的是,当你使用你的方法移动对象时,它比path.relocate(e.getScaleX(),e.getScaleY())有点不稳定,但它仍然可以按预期的方式工作!使用“重新定位”时,鼠标光标将停留在其边界的路径(0,0)的原点,而不是单击鼠标的位置。用我的方法,你把鼠标保持在这一点上。此外,我没有看到你提到的那种不稳定的行为。