Итак, я работал с приложением FXGraphics2D с java, где у вас есть форма, которая обрезается, и вы видите случайный сгенерированный фон из красочных линий на заднем плане. Все прошло нормально, но затем я хотел добавить функцию для перемещения клипа Shape с помощью мыши.
В этом случае к месту, где мышь щелкнула по холсту или перетаскивалась. Вам не нужно быть в форме, чтобы перетаскивать FYI.
Существует одна проблема, которая возникает при удалении клипа или просто очистке холста. Теперь, так как я совсем новичок в FXGraphics2D, но я сам не смог найти его в документации или где-нибудь еще на inte rnet.
Кто-нибудь знает, как решить проблему с полностью очистить холст, независимо от клипа или каким-либо образом заменить клип?
Заранее спасибо!
Текущее состояние после нескольких нажатий: https://i.stack.imgur.com/dPbqI.png Мне кажется, что FXGraphics2D помещает следующий клип позади старых.
Код, который у меня есть;
Draw
public void draw(FXGraphics2D graphics) {
graphics.setTransform(new AffineTransform());
graphics.setBackground(Color.white);
graphics.clearRect(0, 0, (int)canvas.getWidth(), (int)canvas.getHeight());
graphics.setPaint(Color.black);
graphics.draw(clippingEllipse.getShape());
graphics.clip(clippingEllipse.getShape());
Set<Line> lineSet = Line.getLineSet(1000,1920,1080);
for (Line line : lineSet){
graphics.setPaint(line.getColor());
graphics.drawLine(line.getX1(), line.getY1(), line.getX2(), line.getY2());
}
}
Обрабатывать (вызов метода setOnMousePressed () и setOnMouseDragged ())
private void handle(MouseEvent event) {
this.clippingEllipse.setX((int) event.getX() - this.clippingEllipse.getWidth() / 2);
this.clippingEllipse.setY((int) event.getY() - this.clippingEllipse.getWidth() / 2);
}
Start
this.clippingEllipse = new ClippingEllipse(1920/2-100, 1080/2-100, 200);
BorderPane mainPane = new BorderPane();
canvas = new ResizableCanvas(g -> draw(g), mainPane);
mainPane.setCenter(canvas);
FXGraphics2D g2d = new FXGraphics2D(canvas.getGraphicsContext2D());
new AnimationTimer() {
long last = -1;
@Override
public void handle(long now) {
if(last == -1)
last = now;
update((now - last) / 1000000000.0);
last = now;
draw(g2d);
}
}.start();
canvas.setOnMousePressed(event -> handle(event));
canvas.setOnMouseDragged(event -> handle(event));
stage.setScene(new Scene(mainPane));
stage.setFullScreen(true);
stage.setTitle("Spotlight");
stage.show();
draw(g2d);