gpt4 book ai didi

java - javafx中的路径拖动

转载 作者:行者123 更新时间:2023-12-01 12:06:41 24 4
gpt4 key购买 nike

我试图在javafx中创建一个用于路径拖动的事件,但是,使用setLayoutX/Y会将Path元素放在按下鼠标时的光标下方,但会有一个鼠标拖动时平滑拖动。我正在使用 setTranslateX/Y 方法,它不会将 Path 放到光标下方,但是拖动并不平滑,并使 Path 节点向后跳转,拖动时向前。 Path 创建为 freedraw 对象。

我使用以下代码创建路径:

EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle (MouseEvent e) {
if (i == 0) {
if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
j = 1;
path = new Path();
path.setStroke(color);
path.setStrokeWidth(10);
root.getChildren().add(path);
path.getElements().add(new MoveTo(e.getX(), e.getY()));
}
if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
if (j == 1) {
path.getElements().add(new LineTo(e.getX(), e.getY()));
}
}
if (e.getEventType() == MouseEvent.MOUSE_RELEASED) {
if (j == 1) {
path.getElements().add(new LineTo(e.getX(), e.getY()));
path.setOnMouseEntered(new PathEventHandler(paths.size()));
path.setOnMouseExited(new PathEventHandler(paths.size()));
path.setOnMousePressed(new PathEventHandler(paths.size()));
path.setOnMouseDragged(new PathEventHandler(paths.size()));
path.setOnMouseReleased(new PathEventHandler(paths.size()));
path.setOnMouseClicked(new PathEventHandler(paths.size()));
paths.add(path);
cachePath.add(path);
cacheType.add("Create");
j = 0;
}
}
}

为了从路径列表中拖动创建的路径,我使用以下代码:

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_PRESSED) {
x = me.getX();
y = me.getY();
}
if (me.getEventType() == MouseEvent.MOUSE_DRAGGED) {
paths.get(n).setTranslateX(me.getX() - x + paths.get(n).getTranslateX());
paths.get(n).setTranslateY(me.getY() - y + paths.get(n).getTranslateY());
/*paths.get(n).setTranslateX(me.getX());
paths.get(n).setTranslateY(me.getY()); */
listX.add(paths.get(n).getTranslateX());
listY.add(paths.get(n).getTranslateY());
x = me.getX();
y = me.getY();
}
if (me.getEventType() == MouseEvent.MOUSE_RELEASED) {
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");
}
}
}
}

最佳答案

您必须将路径添加到组,然后才能平滑拖动。我不知道您为什么要使用路径列表,但这不需要进一步,因为我们有一个由组对象扭曲的路径对象,您可以在那里对路径对象进行更改。如果由于某种原因您仍然需要列表,您可以将 Group 对象收集到列表中,然后使用它来装饰路径。

然后看看这个并进行这些更改

  if (e.getEventType() == MouseEvent.MOUSE_RELEASED) {
if (j == 1) {
paths.add(path);
root.getChildren().add(new DragablePath(path));
cachePath.add(path);
cacheType.add("Create");


}
}

这里是DragablePath类和DragContext类。您可以像使用“路径事件处理程序”一样使用“DragablePath 事件处理程序”。

class DragablePath extends Group {

private final Node node;

DragablePath(Node node) {
this.node = node;
this.getChildren().add(node);
final DragContext dragContext = new DragContext();
this.addEventFilter(
MouseEvent.ANY,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {
mouseEvent.consume();

}
});
this.addEventFilter(
MouseEvent.MOUSE_ENTERED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {
node.setEffect(new DropShadow(20, Color.BLACK));

}
});
this.addEventFilter(
MouseEvent.MOUSE_EXITED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {
node.setEffect(null);

}
});

this.addEventFilter(
MouseEvent.MOUSE_PRESSED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {
dragContext.mouseAnchorX = mouseEvent.getX();
dragContext.mouseAnchorY = mouseEvent.getY();
dragContext.initialTranslateX = node.getTranslateX();
dragContext.initialTranslateY = node.getTranslateY();

}
});
this.addEventFilter(
MouseEvent.MOUSE_DRAGGED,
new EventHandler<MouseEvent>() {
@Override
public void handle(final MouseEvent mouseEvent) {

node.setTranslateX(
dragContext.initialTranslateX
+ mouseEvent.getX()
- dragContext.mouseAnchorX);
node.setTranslateY(
dragContext.initialTranslateY
+ mouseEvent.getY()
- dragContext.mouseAnchorY);

}
});
this.addEventFilter(
MouseEvent.MOUSE_RELEASED,
new EventHandler<MouseEvent>() {

@Override
public void handle(final MouseEvent mouseEvent) {

}
});

}
}

private static final class DragContext {

public double mouseAnchorX;
public double mouseAnchorY;
public double initialTranslateX;
public double initialTranslateY;

}

**提示:您可以通过 Shape 的 setSmooth(true) 来启用抗锯齿提示。

关于java - javafx中的路径拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com