根据Javafx中的对象,在按下鼠标时发生不同的事情

根据Javafx中的对象,在按下鼠标时发生不同的事情,java,mouseevent,javafx-8,Java,Mouseevent,Javafx 8,如果鼠标单击事件发生在现有圆之外,我希望鼠标单击事件拖动现有圆或创建新圆。现在,代码将拖动圆,但也会在另一个圆的顶部创建一个新的圆。我真的很感激任何帮助清理代码,并使它做一个或另一个。这是代码。我一直在尝试做各种各样的事情来让它工作,但我不知道如何让它只做一件或另一件 import javafx.application.Application; import javafx.scene.Cursor; import javafx.scene.Group; import javafx.event.A

如果鼠标单击事件发生在现有圆之外,我希望鼠标单击事件拖动现有圆或创建新圆。现在,代码将拖动圆,但也会在另一个圆的顶部创建一个新的圆。我真的很感激任何帮助清理代码,并使它做一个或另一个。这是代码。我一直在尝试做各种各样的事情来让它工作,但我不知道如何让它只做一件或另一件

import javafx.application.Application;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.control.ChoiceBox;
import javafx.collections.FXCollections;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

public class Main extends Application {

    double orgSceneX, orgSceneY;
    double orgTranslateX, orgTranslateY;

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Drawing Operations Test");
        Group root = new Group();
        Pane canvas = new Pane();
        canvas.setStyle("-fx-background-color: black;");
        canvas.setPrefSize(200,200);
        Rectangle rectangle = new Rectangle(100,100,Color.RED);
        rectangle.relocate(70,70);
        canvas.getChildren().add(rectangle);

        canvas.addEventHandler(MouseEvent.MOUSE_PRESSED, 
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent e) {
                        Object source = e.getSource();
                        if (!(source instanceof Circle)) {
                            Circle circle = new Circle(20,Color.BLUE);
                            circle.setCursor(Cursor.MOVE);
                            circle.setOnMousePressed(circleOnMousePressedEventHandler);
                        circle.setOnMouseDragged(circleOnMouseDraggedEventHandler);
                        circle.relocate((e.getX()-10),(e.getY()-10));
                        canvas.getChildren().add(circle);
                        System.out.println(source);
                    }


                }

    });

    root.getChildren().add(canvas);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}



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

        @Override
        public void handle(MouseEvent t) {
            orgSceneX = t.getSceneX();
            orgSceneY = t.getSceneY();
            orgTranslateX = ((Circle)(t.getSource())).getTranslateX();
            orgTranslateY = ((Circle)(t.getSource())).getTranslateY();
            System.out.println(t.getSource());

        }
    };

    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)(t.getSource())).setTranslateX(newTranslateX);
            ((Circle)(t.getSource())).setTranslateY(newTranslateY);
        }
    };
}
导入javafx.application.application;
导入javafx.scene.Cursor;
导入javafx.scene.Group;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.canvas.GraphicsContext;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入javafx.scene.control.ChoiceBox;
导入javafx.collections.FXCollections;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
公共类主扩展应用程序{
双orgSceneX,orgSceneY;
双orgTranslateX,orgTranslateY;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
primaryStage.setTitle(“绘图操作测试”);
组根=新组();
窗格画布=新窗格();
canvas.setStyle(“-fx背景色:黑色;”);
canvas.setPrefSize(200200);
矩形=新矩形(100100,颜色为红色);
矩形。重新定位(70,70);
canvas.getChildren().add(矩形);
canvas.addEventHandler(MouseEvent.MOUSE_按下,
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
对象源=e.getSource();
如果(!(圆的源实例)){
圆圈=新圆圈(20,颜色为蓝色);
circle.setCursor(Cursor.MOVE);
circle.setOnMousePressed按下(circleOnMousePressedEventHandler);
circle.setonmousedraggedeventhandler(circleOnMouseDraggedEventHandler);
重新定位((e.getX()-10),(e.getY()-10));
canvas.getChildren().add(圆);
系统输出打印项次(来源);
}
}
});
root.getChildren().add(画布);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
EventHandler circleOnMousePressedEventHandler=
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
orgSceneX=t.getSceneX();
orgSceneY=t.getSceneY();
orgTranslateX=((圆圈)(t.getSource()).getTranslateX();
orgTranslateY=((圆)(t.getSource()).getTranslateY();
System.out.println(t.getSource());
}
};
EventHandler circleOnMouseDraggedEventHandler=
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
双偏移量x=t.getSceneX()-orgSceneX;
double offsetY=t.getSceneY()-orgseney;
双新Translatex=orgTranslateX+offsetX;
双新Translatey=orgTranslateY+offsetY;
((圆)(t.getSource()).setTranslateX(newTranslateX);
((圆)(t.getSource()).setTranslateY(newTranslateY);
}
};
}

我找到了!对我来说,答案是创建一个if-else语句并在循环中使用事件。我相信有一种更优雅的方法可以做到这一点,但我在Java方面不太优雅。。。。。然而

public class Main extends Application {

double orgSceneX, orgSceneY;
double orgTranslateX, orgTranslateY;
Pane canvas;

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

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Drawing Operations Test");
    Group root = new Group();
    canvas = new Pane();
    canvas.setStyle("-fx-background-color: black;");
    canvas.setPrefSize(200,200);
    Rectangle rectangle = new Rectangle(100,100,Color.RED);
    rectangle.relocate(70,70);
    canvas.getChildren().add(rectangle);
    canvas.setOnMousePressed(MousePressedEventHandler);





    root.getChildren().add(canvas);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
}



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

        @Override
        public void handle(MouseEvent e) {
            if (e.getSource() instanceof Circle) {
                orgSceneX = e.getSceneX();
                orgSceneY = e.getSceneY();
                orgTranslateX = ((Circle)(e.getSource())).getTranslateX();
                orgTranslateY = ((Circle)(e.getSource())).getTranslateY();
                e.consume();
                System.out.println(e.getSource());

            }
            else {

                Circle circle = new Circle(20,Color.BLUE);
                circle.setCursor(Cursor.MOVE);
                circle.setOnMousePressed(MousePressedEventHandler);
                circle.setOnMouseDragged(MouseDraggedEventHandler);
                circle.relocate((e.getX()-10),(e.getY()-10));
                canvas.getChildren().add(circle);
                System.out.println(e.getSource());
            }
        }
    };

    EventHandler<MouseEvent> MouseDraggedEventHandler = 
        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)(t.getSource())).setTranslateX(newTranslateX);
            ((Circle)(t.getSource())).setTranslateY(newTranslateY);
        }
    };
public类主扩展应用程序{
双orgSceneX,orgSceneY;
双orgTranslateX,orgTranslateY;
窗格帆布;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
primaryStage.setTitle(“绘图操作测试”);
组根=新组();
canvas=新窗格();
canvas.setStyle(“-fx背景色:黑色;”);
canvas.setPrefSize(200200);
矩形=新矩形(100100,颜色为红色);
矩形。重新定位(70,70);
canvas.getChildren().add(矩形);
canvas.setOnMousePressed(鼠标按下按钮);
root.getChildren().add(画布);
primaryStage.setScene(新场景(根));
primaryStage.show();
}
EventHandler MousePressedEventHandler=
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent e){
if(例如,圆的getSource()实例){
orgSceneX=e.getSceneX();
orgSceneY=e.getSceneY();
orgTranslateX=((圆圈)(e.getSource()).getTranslateX();
orgTranslateY=((圆圈)(e.getSource()).getTranslateY();
e、 消费();
System.out.println(e.getSource());
}
否则{
圆圈=新圆圈(20,颜色为蓝色);
circle.setCursor(Cursor.MOVE);
圆圈。设置鼠标按下(鼠标按下按钮);
circle.setOnMouseDragged(MouseDraggedEventHandler);
重新定位((e.getX()-10),(e.getY()-10));
canvas.getChildren().add(圆);
System.out.println(e.getSource());
}
}
};
EventHandler MouseDraggedEventHandler=
新的EventHandler(){
@凌驾
公共无效句柄(MouseEvent t){
双偏移量x=t.getSceneX()-orgSceneX;
double offsetY=t.getSceneY()-orgseney;
双新Translatex=orgTranslateX+offsetX;
双新变速器
EventHandler<MouseEvent> circleOnMousePressedEventHandler = event -> {
    orgSceneX = event.getSceneX();
    orgSceneY = event.getSceneY();
    orgTranslateX = ((Circle) (event.getSource())).getTranslateX();
    orgTranslateY = ((Circle) (event.getSource())).getTranslateY();
    event.consume();
};