Перетащить линию в пределах 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();
    }
}

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


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

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

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