Batik und AffineTransform

FrittenFritze

Mitglied
Guten Tag zusammen,

ich habe ein Problem mit AffineTransform, bzw. ich verstehe nicht so ganz wie es funktioniert.

Mein Sachverhalt:
-> JPanel mit einem JSVGCanvas drauf
-> eine SVG Datei wird geladen und angezeigt
-> ich versuche das Bild zu verschieben.

Wenn ich das Bild mit der Maus packe (irgendwo auf dem Bild) und versuche es zu schieben, springt die Koordinate 0,0 unter den Mauszeiger, sprich die 0,0 des Bildes wird am Mauszeiger ausgerichtet. Was ja falsch ist. Nun habe ich versucht die Ursprungskoordinate (sprich die beim Drücken der Maustaste) zu speichern und in den AffineTransform zu stecken, das passt auch halbwegs.

Mein Problem ist, dass es das Bild immernoch versetzt, wenn auch nicht so extrem.

Hier ist der Code-Abschnitt, der das Verschieben übernimmt:

Java:
    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("Koordinaten: (" + e.getX() + "; " + e.getY() + ");");
        AffineTransform at = canvas.getRenderingTransform();
        at.setToIdentity();
        at.translate(e.getX(), e.getY());
        at.translate(-p1.getX(),-p1.getY());
        canvas.setRenderingTransform(at, true);
    }

p1 ist dabei die Koordinate beim Drücken der Maustaste, also Ausgangspunkt.

Könnt Ihr mir etwas auf die Sprünge helfen?

Danke im Voraus.
 

mihe7

Top Contributor
Erst mal ganz unabhängig von JSVGCanvas: es kann natürlich sein, dass die Komponente bereits eine Transformation verwendet. In dem Fall würde diese durch at.setToIdentity() zurückgesetzt. Ich würde mir im mousePressed die aktuelle Transformation der Komponente merken, davon in mouseDragged clonen und dann auf den Klon die translate-Geschichten anwenden (ohne setToIdentity, versteht sich).

Den JavaDocs zu JSVGCanvas nach würde ich allerdings vermuten, dass Du das alles frei Haus geliefert bekommst und man lediglich https://xmlgraphics.apache.org/bati...VGCanvas.html#setEnablePanInteractor(boolean) verwenden muss.
 

FrittenFritze

Mitglied
Hallo Mihe7,

das war die Rätsellösung! Danke Dir herzlich.

Hier ist der Code:
Java:
    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("Maus gedrückt");
        if (e.getSource() instanceof JSVGCanvas) {
            canvas = (JSVGCanvas) e.getSource();
            at = canvas.getRenderingTransform();
            p1 = e.getPoint();
        }
    }

Und dann das Ziehen:
Java:
    @Override
    public void mouseDragged(MouseEvent e) {
        System.out.println("Koordinaten: (" + e.getX() + "; " + e.getY() + ");");
        AffineTransform at2 = (AffineTransform) at.clone();
        at2.translate(e.getX(), e.getY());
        at2.translate(-p1.getX(),-p1.getY());
        canvas.setRenderingTransform(at2, true);
    }

Die at, canvas und p1 sind Klassenvariablen.
 

Ähnliche Java Themen

Neue Themen


Oben