Перетаскивание объекта, сразу после его создания.код внутри - Java

Узнай цену своей работы

Формулировка задачи:

В этом простом приложение щелчком мыши создаётся обычный круг. и позднее его можно перетаскивать. как сделать так ,что бы при создании на клик , не отпуская клавиши мыши объект сразу перетаскивался...а не по повторному клику. Получается я нажимаю клавишу -> Создаётся круг и сразу же следует за курсором....и перестаёт следовать за ним когда клавиша отпущена. (перепробовал массу вариантов но так ничего путного и не вышло, надеюсь поможете разобраться.)
package createnodeconnect;
 
import java.util.Random;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
 
public class DraqCrcl extends Application {
    double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY;
    double newTranslateX=0.0;
    double newTranslateY=0.0;
    private final Random rng = new Random();
    boolean selectCrcl = false ;
    Scene scene;
    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        pane.setOnMousePressed(e -> {
            if(selectCrcl == false){
            Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor());
            pane.getChildren().add(crB);
        }});
        scene = new Scene(pane, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) {
        Circle c = new Circle(radius, x, y, fill);
        ObjectProperty<Point2D> mouseLoc = new SimpleObjectProperty<>();
        c.setOnMousePressed(e -> mouseLoc.set(new Point2D(e.getX(), e.getY())));
        c.setOnMouseEntered(r -> {selectCrcl = true;});
        c.setOnMouseExited(r -> {selectCrcl = false;});
        c.setOnMousePressed(mousePressed);
        c.setOnMouseDragged(mouseDragged);
        return c ;
    }
    private Color randomColor() {
        return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1);
    }
     EventHandler<MouseEvent> mousePressed = 
        new EventHandler<MouseEvent>() {
            @Override
        public void handle(MouseEvent t) {
            orgSceneX = t.getSceneX();
            orgSceneY = t.getSceneY();
            orgTranslateX = ((Node)(t.getSource())).getTranslateX();
            orgTranslateY = ((Node)(t.getSource())).getTranslateY();
        }};
EventHandler<MouseEvent> mouseDragged = 
        new EventHandler<MouseEvent>() {
            @Override
        public void handle(MouseEvent t) {
            double offsetX = t.getSceneX() - orgSceneX;
            double offsetY = t.getSceneY() - orgSceneY;
            newTranslateX = orgTranslateX + offsetX;
            newTranslateY = orgTranslateY + offsetY;
            ((Node)(t.getSource())).setTranslateX(newTranslateX);
            ((Node)(t.getSource())).setTranslateY(newTranslateY);
        }};
    public static void main(String[] args) {
        launch(args);
    }
}
Вот почти работает вроде)но всё равно подсказки не помешают
package createnodeconnect;
 
import java.util.Random;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
 
public class DraqCrcl extends Application {
    double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY;
    double newTranslateX=0.0;
    double newTranslateY=0.0;
    private final Random rng = new Random();
    boolean selectCrcl = false ;
    Scene scene;
    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        pane.setOnMousePressed(e -> {
            if(selectCrcl == false){
            Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor());
            pane.getChildren().add(crB);
        }});
         pane.setOnMouseDragged(e -> {
            pane.getChildren().get(pane.getChildren().size()-1).setTranslateX(e.getX());
            pane.getChildren().get(pane.getChildren().size()-1).setTranslateY(e.getY());
      
        });
        scene = new Scene(pane, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) {
        Circle c = new Circle(radius, x, y, fill);
        c.setOnMouseEntered(r -> {selectCrcl = true;});
        c.setOnMouseExited(r -> {selectCrcl = false;});
        c.setOnMousePressed(mousePressed);
        c.setOnMouseDragged(mouseDragged);
        return c ;
    }
    private Color randomColor() {
        return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1);
    }
     EventHandler<MouseEvent> mousePressed = 
        new EventHandler<MouseEvent>() {
            @Override
        public void handle(MouseEvent t) {
            orgSceneX = t.getSceneX();
            orgSceneY = t.getSceneY();
            orgTranslateX = ((Node)(t.getSource())).getTranslateX();
            orgTranslateY = ((Node)(t.getSource())).getTranslateY();
        }};
EventHandler<MouseEvent> mouseDragged = 
        new EventHandler<MouseEvent>() {
            @Override
        public void handle(MouseEvent t) {
            double offsetX = t.getSceneX() - orgSceneX;
            double offsetY = t.getSceneY() - orgSceneY;
            newTranslateX = orgTranslateX + offsetX;
            newTranslateY = orgTranslateY + offsetY;
            ((Node)(t.getSource())).setTranslateX(newTranslateX);
            ((Node)(t.getSource())).setTranslateY(newTranslateY);
        }};
    public static void main(String[] args) {
        launch(args);
    }
}

Решение задачи: «Перетаскивание объекта, сразу после его создания.код внутри»

textual
Листинг программы
package sample;
 
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
 
import java.util.Random;
 
public class DragCircle extends Application {
 
    private Random rnd = new Random();
    private boolean select = false;
 
    @Override
    public void start(Stage primaryStage) throws Exception {
        AnchorPane pane = new AnchorPane();
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
 
        scene.setOnMousePressed(event -> {
            Circle circle = new Circle(event.getX(), event.getY(), 20, randomColor());
            pane.getChildren().add(circle);
            select = true;
        });
        scene.setOnMouseDragged(event -> {
            if (select) {
                ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterX(event.getX());
                ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterY(event.getY());
            }
        });
        scene.setOnMouseReleased(event -> select = false);
 
        primaryStage.show();
    }
 
    private Color randomColor() {return new Color(rnd.nextDouble(), rnd.nextDouble(), rnd.nextDouble(), 1);}
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы