Swing Apache Batik - Zoom an einer bestimmten Stelle

FrittenFritze

Mitglied
Moin zusammen,

ich sitze gerade an einem Problem und zwar, ich verwende in meinem Projekt Apache Batik. s gibt dort die Möglichkeit die geladene SVG Grafik zu zoomen, das funktioniert auch soweit sehr gut.

Code:
import java.awt.Point;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.AffineTransform;

import org.apache.batik.swing.JSVGCanvas;

public class WDSMouseWheelListener implements MouseWheelListener {
  
   protected JSVGCanvas _svgCanvas;
   protected double _factor = 0.1;
  
   public WDSMouseWheelListener (JSVGCanvas svgCanvas) {
     this._svgCanvas = svgCanvas;
   }

   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
     AffineTransform at = _svgCanvas.getRenderingTransform();
    
     double scaleX = at.getScaleX();
     double  scaleY = at.getScaleY();
  
  if (e.getWheelRotation() > 0) {
  scaleX = scaleX - _factor;
  scaleY = scaleY - _factor;
  } else {
  scaleX = scaleX + _factor;
  scaleY = scaleY + _factor;
  }
  
  if (scaleX < 0.1) {
  return;
  }
  
  at.setToScale(scaleX, scaleY);
  _svgCanvas.setRenderingTransform(at, true);
   }

}

Nur ist es aber so, dass die Grafik an der oberen linken Ecke aufgehängt ist und es von da aus gezoomt wird, was sehr komisch aussieht. Sprich es ist nicht so, dass die Grafik am Mauscursor gezoomt wird, was an der Stelle natürlicher wäre.

Über den JSVGCanvas kriege ich zwar die Cursorposition raus, mehr aber auch nicht...

Hat jemand eine Idee, wie es doch gehen könnte? Ich habe leider nichts diesbezüglich in der Doku gefunden :(
 
Zuletzt bearbeitet:

DrZoidberg

Top Contributor
Du könntest das hier versuchen:
Java:
at.translate(mousePosX, mousePosY).scale(1.1, 1.1).translate(-mousePosX, -mousePosY)
 

FrittenFritze

Mitglied
Guten Morgen erstmal und sorry für die späte Rückmeldung.

Ich habe es ausprobiert:

Code:
public class TestMouseWheelListener implements java.awt.event.MouseWheelListener {

   @Override
   public void mouseWheelMoved(MouseWheelEvent e) {
     JSVGCanvas canvas = null;
     int wheelRotation = e.getWheelRotation();
     double scaleX = 0;
     double scaleY = 0;
     double stepSize = 0.1;
     
     if (e.getSource() instanceof JSVGCanvas) {
       canvas = (JSVGCanvas) e.getSource();
       scaleX = canvas.getRenderingTransform().getScaleX();
       scaleY = canvas.getRenderingTransform().getScaleY();
       
       System.out.println ("OLD: " + scaleX + ":" + scaleY);
     }
     
     switch (wheelRotation) {
     case -1:
       scaleX = scaleX - stepSize;
       scaleY = scaleY - stepSize;
       break;
     case 1:
       scaleX = scaleX + stepSize;
       scaleY = scaleY + stepSize;
       break;
     }
     
     System.out.println (wheelRotation);
     System.out.println ("New: " + scaleX + ":" + scaleY);
     
     AffineTransform at = canvas.getRenderingTransform();
     at.translate(e.getX(), e.getY());
     at.scale(scaleX, scaleY);
     at.translate(-e.getX(), -e.getY());
     canvas.setRenderingTransform(at, true);
   }
}

Das Ergebnis sieht so aus (System.out):

OLD: 1.0:1.0
1
New: 1.1:1.1
OLD: 1.1:1.1
1
New: 1.2000000000000002:1.2000000000000002
OLD: 1.3200000000000003:1.3200000000000003
1
New: 1.4200000000000004:1.4200000000000004
OLD: 1.874400000000001:1.874400000000001
-1
New: 1.7744000000000009:1.7744000000000009
OLD: 3.3259353600000034:3.3259353600000034
-1
New: 3.2259353600000034:3.2259353600000034

Das heißt, dass Bild wird nur noch größer... und dann auch in riesigen Schritten. Beim ersten und dem zweiten Inkrementieren aber scheint es sauber zu funktionieren...

Ideen?
 

DrZoidberg

Top Contributor
In deinem Code sind scaleX und Y immer positiv auch nachdem du das Mausrad ein paar mal rückwärts bewegt hast.
Setze scaleX und scaleY auf 1.1 bzw -1.1 je nachdem in welche Richtung gescrollt wurde. getScaleX und getScaleY brauchst du nicht und du musst auch nichts addieren.
 

FrittenFritze

Mitglied
Hab es gestern doch noch hinbekommen:

Code:
public class TestMouseWheelListener implements java.awt.event.MouseWheelListener {

   private double _scaleX = 1;
  private double _scaleY = 1;
  private double _stepSize = 0.1;

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {
    JSVGCanvas canvas = null;
    int wheelRotation = e.getWheelRotation();
  
    Point2D p1 = e.getPoint();
    Point2D p2 = null;
  
    if (e.getSource() instanceof JSVGCanvas) {
    canvas = (JSVGCanvas) e.getSource();
    }
  
    AffineTransform at = canvas.getRenderingTransform();
  
    try {
       p2 = at.inverseTransform(p1, null);
     } catch (NoninvertibleTransformException e1) {
       e1.printStackTrace();
     }
  
    System.out.println ("OLD: " + _scaleX + ":" + _scaleY);
  
    _scaleX -= (_stepSize * e.getWheelRotation());
    _scaleY -= (_stepSize * e.getWheelRotation());
    _scaleX = Math.max(_scaleX, _stepSize);
    _scaleY = Math.max(_scaleY, _stepSize);
  
    System.out.println (wheelRotation);
  
    System.out.println ("New: " + _scaleX + ":" + _scaleY);
  
    at.setToIdentity();
    at.translate(p1.getX(), p1.getY());
    at.scale(_scaleX, _scaleY);
    at.translate(-p2.getX(), -p2.getY());
    canvas.setRenderingTransform(at, true);
    }
   }

Macht genau das, was es soll :)

Was ist aber nicht verstehe, was machen diese beiden Zeilen denn genau?

Code:
    at.translate(p1.getX(), p1.getY());
    at.scale(_scaleX, _scaleY);
    at.translate(-p2.getX(), -p2.getY());
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Apache Proxy Weiterleitung auf Tomcat funktioniert nicht wie gewünscht Allgemeine Java-Themen 1
T Logging mit org.apache.logging.log4j Allgemeine Java-Themen 1
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
H Apache fop -- welche Möglichkeit gibt es um den Fortschritt anzuzeigen (Progressbar) Allgemeine Java-Themen 5
H Apache fop - OutOfMemoryError Allgemeine Java-Themen 10
B Schnittstelle zwischen MySQL und Apache Allgemeine Java-Themen 8
O Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen Allgemeine Java-Themen 6
F Fehlermeldung: java.lang.NoClassDefFoundError: org/apache/commons/net/ntp/NTPUDPClient Allgemeine Java-Themen 6
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
I Apache POI Bild in Word ersetzen Allgemeine Java-Themen 15
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
L APACHE POI PIVOT TABELLEN Allgemeine Java-Themen 4
L Apache POI Datenquelle Allgemeine Java-Themen 1
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L JavaFX JavaFX Chart in Apache Poi Excel Datei Allgemeine Java-Themen 2
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
F Input/Output NullPointerException, aber wieso? [Apache POI] Allgemeine Java-Themen 11
F Input/Output NullPointerException with Apache POI Allgemeine Java-Themen 7
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
J Apache POI - No external workbook with name Allgemeine Java-Themen 5
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
MiMa Apache Tika: Warnmeldungen und Beispielcode Allgemeine Java-Themen 12
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
K Apache poi: Deprecated getCellType Allgemeine Java-Themen 3
J Apache POI Excel- Blattschutz aufheben Allgemeine Java-Themen 2
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T Geschlossen: Apache POI - Excel einlesen Allgemeine Java-Themen 0
K Apache POI Word Tabelle Zellen verbinden Allgemeine Java-Themen 4
K Apache POI Word Tabelle Spaltenbreite festlegen Allgemeine Java-Themen 7
K Apache POI Word bestimmte Textstellen bearbeiten Allgemeine Java-Themen 1
R Apache POI XSSF Allgemeine Java-Themen 2
E Apache POI Powerpoint Verlinkungen ändern Allgemeine Java-Themen 4
T xls-Datei per Apache Commons CsvParser einlesen UTF-8 Zeichen russische Zeichen Allgemeine Java-Themen 2
zer0zer0 Best Practice apache common cli - optionen für hilfe ausblenden Allgemeine Java-Themen 5
S Eclipse Apache Camel FTP: Fehlerbehandlung, wie? Allgemeine Java-Themen 2
H Excel Datei einlesen mit Apache POI Allgemeine Java-Themen 1
GianaSisters Apache POI - Hyperlink erstellen Allgemeine Java-Themen 0
reibi Apache PDFBox Allgemeine Java-Themen 0
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
C Was bekomme ich eine Nullpointerexception? (Apache POI) Allgemeine Java-Themen 3
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
H Apache POI HSSF - Farbe/Rahmen etc. ohne Style-Vorlage? Allgemeine Java-Themen 4
E Apache POI-Datei lesen und umschreiben Allgemeine Java-Themen 8
G Input/Output Apache POI Excel Allgemeine Java-Themen 5
L Apache CLI: Args[] übergeben Allgemeine Java-Themen 3
P docx mit Apache POI auslesen, verändern und zurückschreiben Allgemeine Java-Themen 2
N Applet Apache Poi Wert einer Formel ausgeben Allgemeine Java-Themen 5
L Apache Common CLI Allgemeine Java-Themen 4
J Webstart (auf Apache) jnlp wird nicht geladen Allgemeine Java-Themen 2
S HTTP Apache HTTPClient Problem Allgemeine Java-Themen 4
R org.apache.http kompletter Internetausfall Allgemeine Java-Themen 7
J xlsx Dateien lesen OHNE apache POI Allgemeine Java-Themen 6
V Für was benötigt man Apache Common Allgemeine Java-Themen 3
V Apache POI Excel Datum auslesen Allgemeine Java-Themen 6
V Apache POI Excel Sheet auslesen Allgemeine Java-Themen 5
B Problem mit RegEs und org.apache.regexp.RE Allgemeine Java-Themen 5
T Apache POI Export EXCEL - [Zahlen-Werte] Allgemeine Java-Themen 1
Landei Erfahrungen mit JavaConfig oder Apache Commons Config? Allgemeine Java-Themen 3
J Apache FTPClient upload Allgemeine Java-Themen 3
A Apache License, Version 2.0 Allgemeine Java-Themen 7
S Bzip2 apache commons-compress Allgemeine Java-Themen 3
Chris81T Apache FOP 0.20-5 mit JNI von C++ Code aufrufen Allgemeine Java-Themen 8
C Apache POI(HSSF) Conditional Formatting Allgemeine Java-Themen 3
G Apache soll mit SVN zusammenarbeiten Allgemeine Java-Themen 3
E Apache Commons - PropertyConfiguration - Autosave Allgemeine Java-Themen 2
G Servlet über apache Tomcat ansprechen Allgemeine Java-Themen 6
alexpetri DirectoryWalker apache.commons Allgemeine Java-Themen 3
S Apache Commons Net geht nicht Allgemeine Java-Themen 5
G mit Apache-Jakarta-POI auch Graphiken aus Excel einlesen? Allgemeine Java-Themen 3
T Apache Lucene Allgemeine Java-Themen 2
Q Ant und org.apache.log4j.xml.DOMConfigurator Problem Allgemeine Java-Themen 2
M Java Webserver - Tomcat alleine oder zusammen mit Apache? Allgemeine Java-Themen 3
FrittenFritze Batik und sein "ProtocolHandler" für xlink:href Allgemeine Java-Themen 1
W Batik Problem Allgemeine Java-Themen 4
J Batik zoom in gewählten Bereich Allgemeine Java-Themen 2
J Batik zoom Allgemeine Java-Themen 4
R Zoom In einem grid Allgemeine Java-Themen 0
J zoom zur mausposition Allgemeine Java-Themen 3
P JPanel/Zoom Allgemeine Java-Themen 2
G Bilder zeichnen und Zoom Funktion Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben