JScrollPane - Zoom relativ zu Maus-position

Brauche ich zur Berechnung der neuen position des Viewports beim Zoomen in ein Bild.

Die UI ist wie folgt aufgebaut:

  • ImagePanel zeichnet das Bild
  • ImagePanelWrapper ist ein JPanel umwickeln der imagePanel
  • JScrollPane enthält die ImagePanelWrapper

Beim Zoomen in oder out, das ImagePanel ist der zoom-Faktor geändert wird und die bevorzugte Größe der ImagePanel wird neu berechnet. Somit wird das Bild auf das panel bewegt, obwohl das ImagePanel bleibt an der gleichen viewport Punkt.

Werden die folgenden Methoden aufgerufen, wenn der Benutzer hält die STRG-Taste gedrückt und benutzt das Maus-Rad. Die gegeben point wird die Cursorposition zur Verfügung gestellt von der MouseWheelListener. Mit den Funktionen in diesen Methoden das Bild ist schon der Aufenthalt in der gleichen top-Links-position beim Zoomen in oder out.

Das problem ist, dass ich einfach nicht herausfinden wie Sie sich bewegen, relativ zu der Maus, wie Paint.NET zum Beispiel. Irgendwelche Ideen?

/**
 * 
 */
public void zoomOut(Point point) {
    this.imagePanel.setZoom(this.imagePanel.getZoom() * 0.9f);
    Point pos = this.getViewport().getViewPosition();

    int newX = (int) (pos.x * 0.9f);
    int newY = (int) (pos.y * 0.9f);
    this.getViewport().setViewPosition(new Point(newX, newY));

    this.imagePanel.revalidate();
    this.imagePanel.repaint();
}

/**
 * 
 */
public void zoomIn(Point point) {
    this.imagePanel.setZoom(this.imagePanel.getZoom() * 1.1f);
    Point pos = this.getViewport().getViewPosition();

    int newX = (int) (pos.x * 1.1f);
    int newY = (int) (pos.y * 1.1f);
    this.getViewport().setViewPosition(new Point(newX, newY));

    this.imagePanel.revalidate();
    this.imagePanel.repaint();
}
InformationsquelleAutor maxdev | 2012-10-31
Schreibe einen Kommentar