Я создал 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?