Перетащить линию в пределах Canvas - Java

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

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

Как можно перенести линию мышью в пределах границ холста? если использовать метод setOnMouseMoved то он перерисовывает нужную линию вслед за движениями мыши, но во время клика мыши не может закрепить в нужном месте, пока мышь двигается линия так и будет двигаться без остановки. если применить метод setOnMouseDragged, то он перемещает геометрические примитивы созданные как объект, и перемещает за пределы холста, но зато если кнопку мыши отпустить то перемещение останавливается
Листинг программы
  1. ....
  2. ....
  3. public class Canv extends Application {
  4. private double x;
  5. private double y;
  6. private double xO;
  7. private double yO;
  8. Canvas myCanvas;
  9. GraphicsContext gc;
  10. private void Shapes(GraphicsContext gc) {
  11. GL();
  12. gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
  13. gc.strokeLine(50, 80, 200, 80);
  14. gc.strokeLine(50, 110, 200, 110);
  15. gc.strokeLine(50, 140, 200, 140); // линия которую требуется перетащить
  16. gc.strokeLine(50+x, 140, 200+x, 140); //
  17. }
  18. public void GL() {
  19. myCanvas.setOnMouseMoved(new EventHandler<MouseEvent>() {
  20. public void handle(MouseEvent e) {
  21. x = e.getX() - 40; // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
  22. y = e.getY();
  23. gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
  24. gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
  25. Shapes(gc);
  26. }
  27. });
  28. }
  29. public static void main(String[] args) {
  30. launch(args);
  31. }
  32. public void start(Stage myStage) throws Exception {
  33. myStage.setTitle("Title");
  34. AnchorPane rootPane = new AnchorPane();
  35. Scene myScene = new Scene(rootPane, 700, 400);
  36. myStage.setScene(myScene);
  37. // Canvas
  38. myCanvas = new Canvas(500, 360);
  39. gc = myCanvas.getGraphicsContext2D();
  40. gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
  41. Shapes(gc);
  42. Pane p = new Pane();
  43. Rectangle rect = new Rectangle(40, 20, 50, 100);
  44. p.getChildren().add(rect);
  45. p.setOnMousePressed(new EventHandler<MouseEvent>() {
  46. public void handle(MouseEvent e) {
  47. xO = rect.getX() - e.getScreenX();
  48. yO = rect.getY() - e.getScreenY(); }
  49. });
  50. p.setOnMouseDragged(new EventHandler<MouseEvent>() {
  51. public void handle(MouseEvent e) {
  52. rect.setX(e.getScreenX() + xO); // перемещает прямоугольник за пределы myCanvas
  53. rect.setY(e.getScreenY() + yO);
  54. }
  55. });
  56. // привязки холста
  57. AnchorPane.setLeftAnchor(myCanvas, 40.0);
  58. AnchorPane.setTopAnchor(myCanvas, 20.0);
  59. rootPane.getChildren().add(myCanvas);
  60. rootPane.getChildren().add(p);
  61. myStage.show();
  62. }
  63. }

Решение задачи: «Перетащить линию в пределах Canvas»

textual
Листинг программы
  1. import javafx.application.Application;
  2. import javafx.scene.Scene;
  3. import javafx.scene.canvas.Canvas;
  4. import javafx.scene.canvas.GraphicsContext;
  5. import javafx.scene.layout.AnchorPane;
  6. import javafx.scene.shape.Rectangle;
  7. import javafx.stage.Stage;
  8.  
  9.  
  10. public class Exp extends Application {
  11.  
  12.     Canvas myCanvas;
  13.     GraphicsContext gc;
  14.     private double x;
  15.     private double y;
  16.     private double xO;
  17.     private double yO;
  18.     private boolean moved = true;
  19.  
  20.     public static void main(String[] args) {
  21.         launch(args);
  22.     }
  23.  
  24.     private void Shapes(GraphicsContext gc) {
  25.         GL();
  26.         gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
  27.         gc.strokeLine(50, 80, 200, 80);
  28.         gc.strokeLine(50, 110, 200, 110);
  29.         gc.strokeLine(50, 140, 200, 140);  // линия которую требуется перетащить
  30.         gc.strokeLine(x, 140, x + 150, 140); //
  31.     }
  32.  
  33.     public void GL() {
  34.         myCanvas.setOnMouseMoved(e -> {
  35.             if (moved) {
  36.                 x = Math.min(e.getX(), myCanvas.getWidth() - 150); // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
  37.                 y = e.getY();
  38.                 gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
  39.                 gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
  40.                 Shapes(gc);
  41.             }
  42.         });
  43.         myCanvas.setOnMouseClicked(event -> moved = !moved);
  44.     }
  45.  
  46.     public void start(Stage myStage) throws Exception {
  47.         myStage.setTitle("Title");
  48.         AnchorPane rootPane = new AnchorPane();
  49.         Scene myScene = new Scene(rootPane, 700, 400);
  50.         myStage.setScene(myScene);
  51.  
  52. // Canvas
  53.         myCanvas = new Canvas(500, 360);
  54.         gc = myCanvas.getGraphicsContext2D();
  55.         gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
  56.         Shapes(gc);
  57.         Rectangle rect = new Rectangle(40, 20, 50, 100);
  58.  
  59.         rect.setOnMousePressed(e -> {
  60.             xO = rect.getX() - e.getSceneX();
  61.             yO = rect.getY() - e.getSceneY();
  62.         });
  63.         rect.setOnMouseDragged(e -> {
  64.             double posX = e.getSceneX() + xO;
  65.             double posY = e.getSceneY() + yO;
  66.             if (posX < 40) posX = 40;
  67.             else if (posX + rect.getWidth() > 40 + myCanvas.getWidth())
  68.                 posX = 40 + myCanvas.getWidth() - rect.getWidth();
  69.             if (posY < 20) posY = 20;
  70.             else if (posY + rect.getHeight() > 20 + myCanvas.getHeight())
  71.                 posY = 20 + myCanvas.getHeight() - rect.getHeight();
  72.             rect.setX(posX);
  73.             rect.setY(posY);
  74.         });
  75.  
  76. // привязки холста
  77.         AnchorPane.setLeftAnchor(myCanvas, 40.0);
  78.         AnchorPane.setTopAnchor(myCanvas, 20.0);
  79.         rootPane.getChildren().add(myCanvas);
  80.         rootPane.getChildren().add(rect);
  81.         myStage.show();
  82.     }
  83. }

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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