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

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

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

В этом простом приложение щелчком мыши создаётся обычный круг. и позднее его можно перетаскивать. как сделать так ,что бы при создании на клик , не отпуская клавиши мыши объект сразу перетаскивался...а не по повторному клику. Получается я нажимаю клавишу -> Создаётся круг и сразу же следует за курсором....и перестаёт следовать за ним когда клавиша отпущена. (перепробовал массу вариантов но так ничего путного и не вышло, надеюсь поможете разобраться.)
Листинг программы
  1. package createnodeconnect;
  2. import java.util.Random;
  3. import javafx.application.Application;
  4. import javafx.beans.property.ObjectProperty;
  5. import javafx.beans.property.SimpleObjectProperty;
  6. import javafx.event.EventHandler;
  7. import javafx.geometry.Point2D;
  8. import javafx.scene.Node;
  9. import javafx.scene.Scene;
  10. import javafx.scene.input.MouseEvent;
  11. import javafx.scene.layout.Pane;
  12. import javafx.scene.paint.Color;
  13. import javafx.scene.shape.Circle;
  14. import javafx.stage.Stage;
  15. public class DraqCrcl extends Application {
  16. double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY;
  17. double newTranslateX=0.0;
  18. double newTranslateY=0.0;
  19. private final Random rng = new Random();
  20. boolean selectCrcl = false ;
  21. Scene scene;
  22. @Override
  23. public void start(Stage primaryStage) {
  24. Pane pane = new Pane();
  25. pane.setOnMousePressed(e -> {
  26. if(selectCrcl == false){
  27. Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor());
  28. pane.getChildren().add(crB);
  29. }});
  30. scene = new Scene(pane, 600, 600);
  31. primaryStage.setScene(scene);
  32. primaryStage.show();
  33. }
  34. private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) {
  35. Circle c = new Circle(radius, x, y, fill);
  36. ObjectProperty<Point2D> mouseLoc = new SimpleObjectProperty<>();
  37. c.setOnMousePressed(e -> mouseLoc.set(new Point2D(e.getX(), e.getY())));
  38. c.setOnMouseEntered(r -> {selectCrcl = true;});
  39. c.setOnMouseExited(r -> {selectCrcl = false;});
  40. c.setOnMousePressed(mousePressed);
  41. c.setOnMouseDragged(mouseDragged);
  42. return c ;
  43. }
  44. private Color randomColor() {
  45. return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1);
  46. }
  47. EventHandler<MouseEvent> mousePressed =
  48. new EventHandler<MouseEvent>() {
  49. @Override
  50. public void handle(MouseEvent t) {
  51. orgSceneX = t.getSceneX();
  52. orgSceneY = t.getSceneY();
  53. orgTranslateX = ((Node)(t.getSource())).getTranslateX();
  54. orgTranslateY = ((Node)(t.getSource())).getTranslateY();
  55. }};
  56. EventHandler<MouseEvent> mouseDragged =
  57. new EventHandler<MouseEvent>() {
  58. @Override
  59. public void handle(MouseEvent t) {
  60. double offsetX = t.getSceneX() - orgSceneX;
  61. double offsetY = t.getSceneY() - orgSceneY;
  62. newTranslateX = orgTranslateX + offsetX;
  63. newTranslateY = orgTranslateY + offsetY;
  64. ((Node)(t.getSource())).setTranslateX(newTranslateX);
  65. ((Node)(t.getSource())).setTranslateY(newTranslateY);
  66. }};
  67. public static void main(String[] args) {
  68. launch(args);
  69. }
  70. }
Вот почти работает вроде)но всё равно подсказки не помешают
Листинг программы
  1. package createnodeconnect;
  2. import java.util.Random;
  3. import javafx.application.Application;
  4. import javafx.event.EventHandler;
  5. import javafx.scene.Node;
  6. import javafx.scene.Scene;
  7. import javafx.scene.input.MouseEvent;
  8. import javafx.scene.layout.Pane;
  9. import javafx.scene.paint.Color;
  10. import javafx.scene.shape.Circle;
  11. import javafx.stage.Stage;
  12. public class DraqCrcl extends Application {
  13. double orgSceneX, orgSceneY,orgTranslateX, orgTranslateY;
  14. double newTranslateX=0.0;
  15. double newTranslateY=0.0;
  16. private final Random rng = new Random();
  17. boolean selectCrcl = false ;
  18. Scene scene;
  19. @Override
  20. public void start(Stage primaryStage) {
  21. Pane pane = new Pane();
  22. pane.setOnMousePressed(e -> {
  23. if(selectCrcl == false){
  24. Circle crB = createDraggingCircle(e.getX(), e.getY(), 9, pane, randomColor());
  25. pane.getChildren().add(crB);
  26. }});
  27. pane.setOnMouseDragged(e -> {
  28. pane.getChildren().get(pane.getChildren().size()-1).setTranslateX(e.getX());
  29. pane.getChildren().get(pane.getChildren().size()-1).setTranslateY(e.getY());
  30. });
  31. scene = new Scene(pane, 600, 600);
  32. primaryStage.setScene(scene);
  33. primaryStage.show();
  34. }
  35. private Circle createDraggingCircle(double radius, double x, double y, Pane parent, Color fill) {
  36. Circle c = new Circle(radius, x, y, fill);
  37. c.setOnMouseEntered(r -> {selectCrcl = true;});
  38. c.setOnMouseExited(r -> {selectCrcl = false;});
  39. c.setOnMousePressed(mousePressed);
  40. c.setOnMouseDragged(mouseDragged);
  41. return c ;
  42. }
  43. private Color randomColor() {
  44. return new Color(rng.nextDouble(), rng.nextDouble(), rng.nextDouble(), 1);
  45. }
  46. EventHandler<MouseEvent> mousePressed =
  47. new EventHandler<MouseEvent>() {
  48. @Override
  49. public void handle(MouseEvent t) {
  50. orgSceneX = t.getSceneX();
  51. orgSceneY = t.getSceneY();
  52. orgTranslateX = ((Node)(t.getSource())).getTranslateX();
  53. orgTranslateY = ((Node)(t.getSource())).getTranslateY();
  54. }};
  55. EventHandler<MouseEvent> mouseDragged =
  56. new EventHandler<MouseEvent>() {
  57. @Override
  58. public void handle(MouseEvent t) {
  59. double offsetX = t.getSceneX() - orgSceneX;
  60. double offsetY = t.getSceneY() - orgSceneY;
  61. newTranslateX = orgTranslateX + offsetX;
  62. newTranslateY = orgTranslateY + offsetY;
  63. ((Node)(t.getSource())).setTranslateX(newTranslateX);
  64. ((Node)(t.getSource())).setTranslateY(newTranslateY);
  65. }};
  66. public static void main(String[] args) {
  67. launch(args);
  68. }
  69. }

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

textual
Листинг программы
  1. package sample;
  2.  
  3. import javafx.application.Application;
  4. import javafx.scene.Scene;
  5. import javafx.scene.layout.AnchorPane;
  6. import javafx.scene.paint.Color;
  7. import javafx.scene.shape.Circle;
  8. import javafx.stage.Stage;
  9.  
  10. import java.util.Random;
  11.  
  12. public class DragCircle extends Application {
  13.  
  14.     private Random rnd = new Random();
  15.     private boolean select = false;
  16.  
  17.     @Override
  18.     public void start(Stage primaryStage) throws Exception {
  19.         AnchorPane pane = new AnchorPane();
  20.         Scene scene = new Scene(pane);
  21.         primaryStage.setScene(scene);
  22.  
  23.         scene.setOnMousePressed(event -> {
  24.             Circle circle = new Circle(event.getX(), event.getY(), 20, randomColor());
  25.             pane.getChildren().add(circle);
  26.             select = true;
  27.         });
  28.         scene.setOnMouseDragged(event -> {
  29.             if (select) {
  30.                 ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterX(event.getX());
  31.                 ((Circle) pane.getChildren().get(pane.getChildren().size() - 1)).setCenterY(event.getY());
  32.             }
  33.         });
  34.         scene.setOnMouseReleased(event -> select = false);
  35.  
  36.         primaryStage.show();
  37.     }
  38.  
  39.     private Color randomColor() {return new Color(rnd.nextDouble(), rnd.nextDouble(), rnd.nextDouble(), 1);}
  40.  
  41. }

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


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

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

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы