ich möchte in einer GUI gerne eine Vektorgrafik, d. h. eine SVG anzeigen. Das klappt mittels Batik (https://xmlgraphics.apache.org/batik/) auch soweit ganz gut.
Allerdings reicht für mein Vorhaben das reine anzeigen nicht aus, ich würde auch gerne die X- und Y-Koordinate der SVG an einer bestimmten Mausposition auslesen.
Ich schaffe es allerdings nur entweder die Mausposition auszulesen, diese ändert sich allerdings je nachdem ob man die Größe der GUI ändert oder die SVG zoomt.
Muss das über Batik sein? Du könntest die SVG doch auch über JDom oder ähnliches laden und die Daten in einen GeneralPath parsen. Vllt. gibt es da ja in Batik auch was für.
Von Canvas kann man sich mit getRenderingTransform die Rendering-Transformation holen. Das inverse davon ist das, was du brauchst, um die Maus/Bildschirmkoordinaten in Weltkoordinaten umzurechnen.
mittlerweile habe ich doch noch ein Problem bezüglich der Koordinaten.
Meine SVG stellt einen Plan dar. Mit Klick auf einen beliebigen Punkt, sollen die Koordinaten ausgelesen werden. Zum entsprechenden Punkt werden Daten eingetragen (die sich immer wieder ändern). Diese sollen in eine Datenbank geschrieben werden. Dies klappt dank der Hilfe von Marco13, auch grundsätzlich alles.
Doch bei “Resize” ändern sich die Koordinaten. Bei der Verwendung unterschiedlicher Bildschirm dürfte das ebenfalls ein Problem sein.
Hm…!? Die Weltkoordinaten sollten sich doch nicht ändern. Ein Punkt, der bei Weltkoordinate (123,456) (z.B. die “Position von Berlin”) liegt, wird auf dem Bildschirm vielleicht mal bei (100,200) oder bei (400,600) angezeigt, aber die Weltkoordinaten sollten immer gleich bleiben…!?
Ich hab das Problem gefunden. Die AffineTransform ändert sich bei der Veränderung der Größe nicht automatisch mit. Ich weiß leider nur nicht wie man das ändern kann.
zunächst dachte ich auch, dass ich irgendwas verändert habe. Daher habe ich Dein Beispiel noch mal hineingeladen. Dies hat allerdings nichts geändert. Ich verwende 1:1 Dein Beispiel, und dennoch sind die Koordinaten gleich.
Standardmäßig wird das ganze einfach so groß angezeigt, “wie es ist”. D.h. am Anfang sind die Weltkoordinaten und die Pixelkoordinaten gleich.
Wenn du mit den Pfeiltasten in der Ansicht rumscrollst oder mit STRG+I oder STRG+O zoomst, sollten danach die Koordinaten nicht mehr gleich sein. Sind sie das bei dir?
Nein, dann sind die Koordinaten nicht gleich. Auf die Idee das zu testen bin ich nicht gekommen.
Das Problem ist allerdings, dass sich die Welt-Koordinaten ändern, wenn ich die Größe des JFrames ändere, d.h. der eigentlich selbe Punkt in der Welt ist nicht mehr an der Selben Koordinatenstelle.
Also wenn man das Beispiel startet, kann man die Fenstergröße ändern und die Karte verschieben und zoomen, wie man will: Wenn man auf den gleichen (Welt-) Punkt klickt, kommen auch immer die gleichen Weltkoordinaten raus…
(Kann es sein, dass du dir die RenderingTransform irgendwo abholst und das nach einer Änderung dann eben die alte ist?)
hoffentlich ist es in Ordnung diesen alten Thread wieder auszubuddeln. Es ist ein bisschen her, dass ich mich zuletzt mit dem Programmieren beschäftigen konnte - mein Problem bleibt aber leider bestehen.
Was Du schreibst ist alles vollkommen korrekt. Ich starte Dein Beispiel, ändere die Größe des JFrames und habe dann beim Zoomen und Bewegen mit den Maustasten die gleichen Koordinaten.
Mein Problem beginnt danach. Wenn ich jetzt die Größe des JFrames ändere, ändern sich auch die Weltkoordinaten. Es sind nun andere Weltkoordinaten als vor der Änderung der Framegröße.
Genau. Hier mal eine ausführliche Beschreibung meines Problems:
Ich starte das Programm und klicke auf einen Punkt, sagen wir mal Berlin. Nun sagt mir das Programm: Weltkoordinaten: 485.0, 219.0 Screenkoordinaten: 485.0, 219.0. Bis hierhin ist alles wie es soll.
Ich verschiebe die Grafik mit den Pfeiltasten und nun sagt mir das Programm : Weltkoordinaten: 483.0, 219.0 Screenkoordinaten: 393.0, 219.0. Bis hierhin ist immer noch alles wie es soll, die leichten Änderungen der Weltkoordinaten liegen daran, dass ich nicht exakt klicke.
Ich zoome die Grafik mit den STRG + I und nun sagt mir das Programm : Weltkoordinaten: 485.0, 220.0 Screenkoordinaten: 290.0, 100.0. Bis hierhin ist immer noch alles wie es soll.
Nun Ändere ich die Größe des JFrame indem ich das Fenster Maximiere. Nun sagt mir das Programm : Weltkoordinaten: 635.0, 219,5 Screenkoordinaten: 440.0, 98.0. Die Weltkoordinaten haben sich also durch die Maximierung des Fensters geändert.
Könntest du das gleiche auch mal mit Zwei Koordinaten machen. Also München und Berlin zum Beispiel.
Und wie veränderst du das Fenster, wohin verschiebt sich der Nullpunkt des Fensters beim maximieren. Welche Fenstergrössen sind es vor und nach der Grössenänderung.
Wird beim maximieren die Zoomstufe verändert oder bleibt diese gleich.
Das wären zumindest noch Fragen die der Lösung des Problems weiterhelfen könnten.
Ich verwende wieder das Beispiel das Marco13 hier im November gepostet hat.
Wenn ich zwei Koordinaten habe, gelten die Beobachtungen entsprechend für beide. Beim Ändern der Framegröße ändern sich auch deren Weltkoordinaten.
Ich maximiere indem ich oben auf der Fensterleiste auf Maximieren klicke. Und Minimiere indem ich entweder wieder darauf klicke oder einen der Ränder mit der Maus einfach kleiner ziehe.
Ich haben das Programm mit Testweise mit f.setSize(700, 400) gestartet. Die Weltkoordinaten sind beginnen von ca. 0.0, 0.0 oben links bis 700, 340 unten rechts (60 für den Texterbreich könnte hinkommen). Nach dem Maximieren ist die Weltkoordinate unten Rechts bei ca. 1298, 682. Dieser Wert entspricht dann auch wieder den Mauskoordinaten.
Wenn ich das Fenster maximiere wird das SVG vergrößert. Wenn ich es das Frame kleiner ziehe wird das SVG entsprechend kleiner. D. h. maximieren und minimieren verändert die Zoomstufe.
Mir wäre es wichtig, dass ich die Punkte an mehreren Computern abfragen kann und der selbe Punkt am jedem PC am selben Ort ist. Ist das mit den Weltkoordinaten sicher machbar?
Hab’s gerade nochmal probiert: Egal, wie man zoomt oder verschiebt oder die Fenstergröße ändert: Die Weltkoordinaten für den gleichen Punkt (etwa Berlin) bleiben gleich…
mittlerweile habe ich denke ich das Problem lokalisiert. Es kommt aus irgendeinem Grund auf die SVG Datei an. Manche SVGs skalieren bei Änderung des JFrames nicht, wie das von Dir verwendete. Manche schon. Und sobald dies passiert ändern sich auch die Weltkoordinaten.