Перетащить линию в пределах Canvas - Java
Формулировка задачи:
Как можно перенести линию мышью в пределах границ холста?
если использовать метод setOnMouseMoved то он перерисовывает нужную линию вслед за движениями мыши, но во время клика мыши не может закрепить в нужном месте, пока мышь двигается линия так и будет двигаться без остановки.
если применить метод setOnMouseDragged, то он перемещает геометрические примитивы созданные как объект, и перемещает за пределы холста, но зато если кнопку мыши отпустить то перемещение останавливается
Листинг программы
- ....
- ....
- public class Canv extends Application {
- private double x;
- private double y;
- private double xO;
- private double yO;
- Canvas myCanvas;
- GraphicsContext gc;
- private void Shapes(GraphicsContext gc) {
- GL();
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
- gc.strokeLine(50, 80, 200, 80);
- gc.strokeLine(50, 110, 200, 110);
- gc.strokeLine(50, 140, 200, 140); // линия которую требуется перетащить
- gc.strokeLine(50+x, 140, 200+x, 140); //
- }
- public void GL() {
- myCanvas.setOnMouseMoved(new EventHandler<MouseEvent>() {
- public void handle(MouseEvent e) {
- x = e.getX() - 40; // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
- y = e.getY();
- gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
- Shapes(gc);
- }
- });
- }
- public static void main(String[] args) {
- launch(args);
- }
- public void start(Stage myStage) throws Exception {
- myStage.setTitle("Title");
- AnchorPane rootPane = new AnchorPane();
- Scene myScene = new Scene(rootPane, 700, 400);
- myStage.setScene(myScene);
- // Canvas
- myCanvas = new Canvas(500, 360);
- gc = myCanvas.getGraphicsContext2D();
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
- Shapes(gc);
- Pane p = new Pane();
- Rectangle rect = new Rectangle(40, 20, 50, 100);
- p.getChildren().add(rect);
- p.setOnMousePressed(new EventHandler<MouseEvent>() {
- public void handle(MouseEvent e) {
- xO = rect.getX() - e.getScreenX();
- yO = rect.getY() - e.getScreenY(); }
- });
- p.setOnMouseDragged(new EventHandler<MouseEvent>() {
- public void handle(MouseEvent e) {
- rect.setX(e.getScreenX() + xO); // перемещает прямоугольник за пределы myCanvas
- rect.setY(e.getScreenY() + yO);
- }
- });
- // привязки холста
- AnchorPane.setLeftAnchor(myCanvas, 40.0);
- AnchorPane.setTopAnchor(myCanvas, 20.0);
- rootPane.getChildren().add(myCanvas);
- rootPane.getChildren().add(p);
- myStage.show();
- }
- }
Решение задачи: «Перетащить линию в пределах Canvas»
textual
Листинг программы
- import javafx.application.Application;
- import javafx.scene.Scene;
- import javafx.scene.canvas.Canvas;
- import javafx.scene.canvas.GraphicsContext;
- import javafx.scene.layout.AnchorPane;
- import javafx.scene.shape.Rectangle;
- import javafx.stage.Stage;
- public class Exp extends Application {
- Canvas myCanvas;
- GraphicsContext gc;
- private double x;
- private double y;
- private double xO;
- private double yO;
- private boolean moved = true;
- public static void main(String[] args) {
- launch(args);
- }
- private void Shapes(GraphicsContext gc) {
- GL();
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3); // границы холста
- gc.strokeLine(50, 80, 200, 80);
- gc.strokeLine(50, 110, 200, 110);
- gc.strokeLine(50, 140, 200, 140); // линия которую требуется перетащить
- gc.strokeLine(x, 140, x + 150, 140); //
- }
- public void GL() {
- myCanvas.setOnMouseMoved(e -> {
- if (moved) {
- x = Math.min(e.getX(), myCanvas.getWidth() - 150); // 40 левый отступ AnchorPane.setLeftAnchor(myCanvas, 40.0);
- y = e.getY();
- gc.clearRect(0, 0, myCanvas.getWidth(), myCanvas.getHeight());
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
- Shapes(gc);
- }
- });
- myCanvas.setOnMouseClicked(event -> moved = !moved);
- }
- public void start(Stage myStage) throws Exception {
- myStage.setTitle("Title");
- AnchorPane rootPane = new AnchorPane();
- Scene myScene = new Scene(rootPane, 700, 400);
- myStage.setScene(myScene);
- // Canvas
- myCanvas = new Canvas(500, 360);
- gc = myCanvas.getGraphicsContext2D();
- gc.strokeRect(2, 2, myCanvas.getWidth() - 3, myCanvas.getHeight() - 3);
- Shapes(gc);
- Rectangle rect = new Rectangle(40, 20, 50, 100);
- rect.setOnMousePressed(e -> {
- xO = rect.getX() - e.getSceneX();
- yO = rect.getY() - e.getSceneY();
- });
- rect.setOnMouseDragged(e -> {
- double posX = e.getSceneX() + xO;
- double posY = e.getSceneY() + yO;
- if (posX < 40) posX = 40;
- else if (posX + rect.getWidth() > 40 + myCanvas.getWidth())
- posX = 40 + myCanvas.getWidth() - rect.getWidth();
- if (posY < 20) posY = 20;
- else if (posY + rect.getHeight() > 20 + myCanvas.getHeight())
- posY = 20 + myCanvas.getHeight() - rect.getHeight();
- rect.setX(posX);
- rect.setY(posY);
- });
- // привязки холста
- AnchorPane.setLeftAnchor(myCanvas, 40.0);
- AnchorPane.setTopAnchor(myCanvas, 20.0);
- rootPane.getChildren().add(myCanvas);
- rootPane.getChildren().add(rect);
- myStage.show();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д