Перетаскивание объекта, сразу после его создания.код внутри - 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);}
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д