JavaFX, выберите и переместите изображение Canvas с помощью мыши - PullRequest
0 голосов
/ 30 марта 2019

Я создал ArrayList и нарисовал его на холсте. Класс Shape содержит его позицию и метод рисования (с использованием canvas). Я создал событие мыши, чтобы выбрать звезду и двигаться, двигаясь. во время движения экран продолжает обновляться. Фактическая фигура не перемещается на холсте. для события мыши, я в основном ссылался на Выбор и перемещение изображения холста с помощью MouseEvent и MouseClicked в JavaFX в этом сообщении.

Я проверил, что координаты в объекте фигуры, безусловно, меняются, и я также проверил, что экран продолжает обновляться.

public class Drawing1 extends Application {

    public static final double WINDOW_WIDTH = 700;
    public static final double WINDOW_HEIGHT = 400;
    public static final double CANVAS_HEIGHT = 300;

    GraphicsContext gc;
    ArrayList<Star> stars = new ArrayList<Star>();
    double startX;
    double startY;
    Color stroke, fill;

    private void clear() {
        gc.setFill(Color.WHITE);
        gc.fillRect(0, 0, WINDOW_WIDTH, CANVAS_HEIGHT);
    }

    private void redraw() {
        clear();
        for (Star star : stars) {
            star.draw();
        }
        System.out.println("refresh");
    }

    @Override
    public void start(Stage stage) throws Exception {
        GridPane root = new GridPane();
        Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT);
        stage.setTitle("Drawing");
        stage.setScene(scene);

        // *** Canvas
        Canvas canvas = new Canvas(WINDOW_WIDTH, CANVAS_HEIGHT);
        root.add(canvas, 0, 0, 3, 1);
        gc = canvas.getGraphicsContext2D();
        clear();

        // *** (trying) drag
        stars.add(new Star(gc, 100, 100, 100, 100, Color.BLACK, Color.AQUA));
        stars.add(new Star(gc, 150, 150, 100, 100, Color.BLACK, Color.YELLOW));

        canvas.setOnMouseClicked(e -> this.select(e));
        canvas.setOnMouseMoved(e -> {
            if (this.nowSelected) {
                this.move(e, canvas);
            }
        });

        stage.show();
    }

    double mouse_x = 0.0;
    double mouse_y = 0.0;
    Star selectedStar;
    boolean nowSelected;

    public void select(MouseEvent e) {
        double temp_mouse_x = e.getSceneX();
        double temp_mouse_y = e.getSceneY();

        for (int i = stars.size() - 1; i >= 0; i--) {
            Star star = stars.get(i);
            double x_max = star.getX() + star.getWidth();
            double y_max = star.getY() + star.getHeight();
            nowSelected = temp_mouse_x >= star.getX() && temp_mouse_x <= x_max // x-area
                    && temp_mouse_y >= star.getY() && temp_mouse_y <= y_max; //y-area              

            this.mouse_x = temp_mouse_x;
            this.mouse_y = temp_mouse_y;

            if (!nowSelected) {
                star.setSelected(false);
            } else if (star.isSelected() && nowSelected) { // deselect the circle if already selected
                star.setSelected(false);
                System.out.println(i + " index star deselected");
            } else {
                star.setSelected(true);
                System.out.println(i + " index star selected");
                selectedStar = star;   // needs deselector for all the others
                return;
            }
        }
    }

    public void move(MouseEvent e, Canvas canvas) {
        selectedStar.setX(this.mouse_x);
        selectedStar.setY(this.mouse_y);
        redraw();
        this.mouse_x = e.getSceneX();
        this.mouse_y = e.getSceneY();
        System.out.println(selectedStar);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Я хочу, чтобы выбранная фигура двигалась с помощью мыши. Кстати, он фактически выбирает площадь, в которой он содержится, но не фактическую площадь. Есть ли способ точно выбрать нарисованный на холсте вместо использования расширенного класса Shape?

...