Замена клипа в java на FXGraphics2D (Java .awt) - PullRequest
0 голосов
/ 21 февраля 2020

Итак, я работал с приложением 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);

1 Ответ

0 голосов
/ 04 марта 2020

Решение, с которым я столкнулся, для заинтересованных людей:

graphics.clip(clippingEllipse.getShape()); до graphics.setClip(clippingEllipse.getShape());

&

Добавьте это в конец метода draw (); graphics.clip(null);

изменить: также возможно: graphics.setClip(null);

...