gpt4 book ai didi

java - 鼠标拖动手势

转载 作者:行者123 更新时间:2023-11-30 11:09:53 27 4
gpt4 key购买 nike

我正在尝试拖动节点并将它们放在彼此之上。这是一个简单的类,我希望它会对拖动手势使用react,但它不会

public class CircleDrag extends Circle
{

double x, y;
String name;
int count = 0;

public CircleDrag(double centerX, double centerY, String name)
{
super(centerX, centerY, 10);
this.name = name;

setOnDragDetected(e ->
{
startFullDrag();
startDragAndDrop(TransferMode.ANY); // tried with and without this line.
logIt(e);
});

setOnDragEntered(e ->
{
logIt(e);
});

setOnDragDone(e ->
{
logIt(e);
});

setOnDragOver(e ->
{
logIt(e);
});

setOnMousePressed(e ->
{
logIt(e);
setMouseTransparent(true);
x = getLayoutX() - e.getSceneX();
y = getLayoutY() - e.getSceneY();
});

setOnMouseReleased(e ->
{
logIt(e);
setMouseTransparent(false);
});

setOnMouseDragged(e ->
{
logIt(e);
setLayoutX(e.getSceneX() + x);
setLayoutY(e.getSceneY() + y);
});

}

private void logIt(Event e)
{
System.out.printf("%05d %s: %s\n", count++, name, e.getEventType().getName());
}

}

我期望将一堆 CircleDrags 添加到一个 Pane 中,当将一个 CircleDrags 拖到另一个上时,另一个会触发 onDrag* 事件。但事实并非如此。

我不明白这个手势是什么意思?

谢谢奥利。

最佳答案

一般情况下,您可以这样做:

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class PhysicsTest extends Application {

public static List<Circle> circles = new ArrayList<Circle>();

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) {

Group root = new Group();

Circle circle1 = new Circle( 50);
circle1.setStroke(Color.GREEN);
circle1.setFill(Color.GREEN.deriveColor(1, 1, 1, 0.3));
circle1.relocate(100, 100);

Circle circle2 = new Circle( 50);
circle2.setStroke(Color.BLUE);
circle2.setFill(Color.BLUE.deriveColor(1, 1, 1, 0.3));
circle2.relocate(200, 200);


MouseGestures mg = new MouseGestures();
mg.makeDraggable( circle1);
mg.makeDraggable( circle2);

circles.add( circle1);
circles.add( circle2);

root.getChildren().addAll(circle1, circle2);

primaryStage.setScene(new Scene(root, 1600, 900));
primaryStage.show();
}



public static class MouseGestures {

double orgSceneX, orgSceneY;
double orgTranslateX, orgTranslateY;

public void makeDraggable( Node node) {
node.setOnMousePressed(circleOnMousePressedEventHandler);
node.setOnMouseDragged(circleOnMouseDraggedEventHandler);
}

EventHandler<MouseEvent> circleOnMousePressedEventHandler = new EventHandler<MouseEvent>() {

@Override
public void handle(MouseEvent t) {

orgSceneX = t.getSceneX();
orgSceneY = t.getSceneY();

Circle p = ((Circle) (t.getSource()));

orgTranslateX = p.getCenterX();
orgTranslateY = p.getCenterY();
}
};

EventHandler<MouseEvent> circleOnMouseDraggedEventHandler = new EventHandler<MouseEvent>() {

@Override
public void handle(MouseEvent t) {

double offsetX = t.getSceneX() - orgSceneX;
double offsetY = t.getSceneY() - orgSceneY;

double newTranslateX = orgTranslateX + offsetX;
double newTranslateY = orgTranslateY + offsetY;

Circle p = ((Circle) (t.getSource()));

p.setCenterX(newTranslateX);
p.setCenterY(newTranslateY);

for( Circle c: circles) {

if( c == p)
continue;

if( c.getBoundsInParent().intersects(p.getBoundsInParent())) {
System.out.println( "Overlapping!");
}
}
}
};

}

}

请注意,此解决方案使用父级中的边界,即最后一个矩形用于重叠检查。如果您想使用圆检查,您可以使用半径并检查圆之间的距离。取决于您的要求。

关于java - 鼠标拖动手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27977235/

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