Zoom zur Mouseposition in ScrollPane

daMSTRin

Neues Mitglied
Hi,
Ich versuche gerade eine Zoom Funktion für ein ScrollPane zu implementieren.
Dabei will ich sicherstellen, dass der Punkt unter der Mouse nach dem Skalieren auch
unter der Mouse bleibt.
Meine Überlegung:
s.x,s.y seien die Koordinaten des Viewport
m.x,m.y seien die Koordinaten der Mouse Relativ zum ScrollPane

Dann ist der Punkt, dessen Position gleich bleiben soll, gegeben durch (s.x+m.x),(s.y+m.y).
Wenn ich also um den Faktor 10% Zoome, bekommt dieser Punkt die Koordinaten (s.x+m.x)*0.9,(s.y+m.y)*0.9 bzw. (s.x+m.x)*1.1,(s.y+m.y)*1.1.
Damit dieser Punkt unter der Mouse bleibt muss der Viewport also doch auf
(s.x+m.x)*0.9-m.x,(s.y+m.y)*0.9-m.y setzten oder?

Anbei die Methode die dies Implementieren sollte.
Java:
    private void jScrollPaneMouseWheelMoved(MouseWheelEvent evt) {                                             
        viewPosition = jScrollPane.getViewport().getViewPosition();
        Point mousepos=jScrollPane.getMousePosition(true);
        scale = scale + evt.getWheelRotation() * 0.10f;
        if (1 > scale && scale > 0.20f) {
            if (evt.getWheelRotation() > 0) {
                jScrollPane.getViewport().setViewPosition(new Point((int) ((viewPosition.x+mousepos.x) * 0.90f)-mousepos.x, (int) (((viewPosition.y+mousepos.y) * 0.90f))-mousepos.y));
            } else if (evt.getWheelRotation() < 0) {
                jScrollPane.getViewport().setViewPosition(new Point((int) (((viewPosition.x+mousepos.x) * 1.10f))-mousepos.x, (int) ((viewPosition.y+mousepos.y) * 1.10f)-mousepos.y));
            }
        } else if (scale <= 0.20f) {
            scale = 0.15f;
        } else if (scale >= 1.0f) {
            scale = 1.0f;
        }
        bild.setScale(scale);
        bild.repaint();


    }

Das Verhalten das ich auf diese Art erreiche ist leider nicht die erwartete :/.
Ich hoffe ihr könnt mir weiterhelfen und meinen Fehler erklären und einen lösungsvorschlag geben.

Danke

mfg daMSTRin
 

Marco13

Top Contributor
Ja, irgendwie stolper' ich da auch jedes mal drüber (obwohl es an sich trivial sein sollte :oops: ). Was ist denn "bild"? Ein KSKB wäre gut.
 

DanZ

Bekanntes Mitglied
Ein Problem könnte sein, dass du für die Verschiebung der Maus immer von einem Zoomschritt (0.1) ausgehst während sich der tatsächliche Zoom je nach Anzahl der Umdrehungen ändert.
 

daMSTRin

Neues Mitglied
Danke für die Antworten, anbei die gesamte Klasse.
An sich ist das bild einfach nur ein Bild das dann entsprechend
beim zeichnen skaliert wird. Ich hab jetzt soweit glaub ich alles
nicht relevante gelöscht.
Bitte entschuldigt wie ich Programmiere, aber im moment Programmiere ich das
Projekt nur so alleine vor mir her. MapBild tut im original mehr als nur das Bild
zeichnen.

danke, mfg daMSTRin
Java:
public class MapPanel extends JPanel {
    private JScrollPane jScrollPane;
    private MapBild bild;
    private Point viewPosition;
    private float scale = 1.0f;

    public MapPanel() {

        String separator = System.getProperty("file.separator");
        String rootPath = System.getProperty("user.dir");
        String imgPath = rootPath + separator + "src" + separator + "hakatastosuniverse" + separator + "images" + separator + "MAP.jpg";

        File file = new File(imgPath);
        BufferedImage a = null;
        try {
            a = ImageIO.read(file);
        } catch (IOException ex) {
            Logger.getLogger(MapPanel.class.getName()).log(Level.SEVERE, null, ex);
        }

        bild = new MapBild(a);
        initComponents();



    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane = new JScrollPane(bild);

        setMinimumSize(new java.awt.Dimension(774, 683));
        setPreferredSize(new java.awt.Dimension(774, 683));

        jScrollPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jScrollPane.setPreferredSize(new java.awt.Dimension(1019, 740));
        jScrollPane.setWheelScrollingEnabled(false);
        jScrollPane.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
            public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
                jScrollPaneMouseWheelMoved(evt);
            }
        });
        jScrollPane.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                jScrollPaneMouseDragged(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 774, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 683, Short.MAX_VALUE)
        );
    }// </editor-fold>                        

    private void jScrollPaneMouseDragged(java.awt.event.MouseEvent evt) {                                         
//ToDo
    }                                        
    
    private void jScrollPaneMouseWheelMoved(java.awt.event.MouseWheelEvent evt) {                                            
        viewPosition = jScrollPane.getViewport().getViewPosition();
        Point mousepos=jScrollPane.getMousePosition(true);
        scale = scale + evt.getWheelRotation() * 0.10f;
        if (1 > scale && scale > 0.20f) {
            if (evt.getWheelRotation() > 0) {
                jScrollPane.getViewport().setViewPosition(new Point((int) ((viewPosition.x+mousepos.x) * 0.90f)-mousepos.x, (int) (((viewPosition.y+mousepos.y) * 0.90f))-mousepos.y));
            } else if (evt.getWheelRotation() < 0) {
                jScrollPane.getViewport().setViewPosition(new Point((int) (((viewPosition.x+mousepos.x) * 1.10f))-mousepos.x, (int) ((viewPosition.y+mousepos.y) * 1.10f)-mousepos.y));
            }
        } else if (scale <= 0.20f) {
            scale = 0.15f;
        } else if (scale >= 1.0f) {
            scale = 1.0f;
        }
        bild.setScale(scale);
        bild.repaint();


    }                                           

    public class MapBild extends JComponent {

        private Image img;
        private float scale = 1.0f;

        public MapBild(){

        }
        public MapBild(Image img) {
            this.img = img;
            int w = img.getWidth(this);
            int h = img.getHeight(this);

            setPreferredSize(new Dimension(w, h));
        }

        public void setScale(float scalep) {
            this.scale = scalep;
        }

        public float getScale() {
            return scale;
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.scale(scale, scale);
            int w = (int) (img.getWidth(bild) * scale);
            int h = (int) (img.getHeight(bild) * scale);
            //g2.drawImage(img, 0, 0,(int)(img.getWidth(bild)*scale),(int)(img.getHeight(bild)*scale), null);
            g2.drawImage(img, 0, 0, null);
            //System.out.println(w+":"+h); 774:683
            setPreferredSize(new Dimension(w, h));
            revalidate();
        }
    } 

}
 

Marco13

Top Contributor
Sitze hier tatsächlich gerade an einem PC ohne Mausrad :oops: aber .. muss bei einer Änderung von 'scale' nicht auch die PreferredSize des Bild-Panels angepasst werden? Ansonsten müßte man das halt mal zu einem KSKB machen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
T JavaFX Zoom in ScrollPane AWT, Swing, JavaFX & SWT 1
M JFreechart Zoom out AWT, Swing, JavaFX & SWT 2
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
B jLabel zoom AWT, Swing, JavaFX & SWT 2
Developer_X Swing Graphics2D.zoom, wie rückgängig machen? AWT, Swing, JavaFX & SWT 6
Dragonfire Swing Zoom-Vorgang optimieren [BufferedImage] AWT, Swing, JavaFX & SWT 2
Dragonfire Swing Zoom mit JPanel und repaint() ... AWT, Swing, JavaFX & SWT 3
E Bild effektiv vergrössern / verkleinern (zoom) AWT, Swing, JavaFX & SWT 23
T Zoom AWT, Swing, JavaFX & SWT 3
F ZOOM Funktion in JTextPane AWT, Swing, JavaFX & SWT 6
D Zoom problem!!! (brauche screenshot...) plz help thx AWT, Swing, JavaFX & SWT 7
E Swing JTable MousePosition nicht lesbar?! AWT, Swing, JavaFX & SWT 4
L Swing MousePosition in einem JPanel abfragen AWT, Swing, JavaFX & SWT 4
R MousePosition über mehrere JPanels darstellen AWT, Swing, JavaFX & SWT 13
G MousePosition innerhalb eines MouseWheelEvents AWT, Swing, JavaFX & SWT 2
S MousePosition AWT, Swing, JavaFX & SWT 3
E GridLayout auf ScrollPane AWT, Swing, JavaFX & SWT 4
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
TheWhiteShadow JavaFX ScrollPane nimmt nicht genug platz ein AWT, Swing, JavaFX & SWT 3
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
E JavaFX Cursor-Position im ScrollPane AWT, Swing, JavaFX & SWT 0
E Swing Liste in Scrollpane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C JavaFX ScrollPane schießt über das Ziel hinaus... AWT, Swing, JavaFX & SWT 1
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
L Java FX Scrollpane automatisch resizen AWT, Swing, JavaFX & SWT 3
P Java ScrollPane und ViewPort AWT, Swing, JavaFX & SWT 2
M JavaFX Scrollpane: Style von Contentpanel default AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
O ScrollPane AWT, Swing, JavaFX & SWT 2
W JavaFX Scrollpane elementweise scrollen AWT, Swing, JavaFX & SWT 4
M SWT ScrollPane Größe zu klein AWT, Swing, JavaFX & SWT 6
Z Swing Welcher Layoutmanager bei ScrollPane? AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
Bluedaishi Synchrone ScrollPane trennen AWT, Swing, JavaFX & SWT 2
G JTable als fixierte Spalte in Scrollpane scrollt nicht mit... AWT, Swing, JavaFX & SWT 1
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
W Swing Zum Ende einer Scrollpane scrollen AWT, Swing, JavaFX & SWT 2
S Bestimmten Bereich eines Bildes im JFrame mit Scrollpane anzeigen AWT, Swing, JavaFX & SWT 0
Kenan89 Vertikal und horizontal zentrierter Pane in ScrollPane AWT, Swing, JavaFX & SWT 5
Kenan89 Java FX ScrollPane Content mittig setzen AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
O Swing GroupLayout und Scrollpane AWT, Swing, JavaFX & SWT 3
T scrollpane taucht nicht auf AWT, Swing, JavaFX & SWT 6
F AWT ScrollPane Problem AWT, Swing, JavaFX & SWT 3
S Swing Bild in JPanel in ScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 2
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
D JTable in Scrollpane AWT, Swing, JavaFX & SWT 3
H ScrollPane AWT, Swing, JavaFX & SWT 3
0 JTable im ScrollPane AWT, Swing, JavaFX & SWT 3
S Swing Scrollpane und JTables AWT, Swing, JavaFX & SWT 6
D Swing JList: ScrollPane auf JPanel ansprechen AWT, Swing, JavaFX & SWT 7
Spin JTable Header wird nicht angezeigt ohne ScrollPane AWT, Swing, JavaFX & SWT 3
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
_dp Swing ScrollPane unterschlägt Großteil der Tabelle AWT, Swing, JavaFX & SWT 7
T ScrollPane Lösgelöst vom JPanel?!? AWT, Swing, JavaFX & SWT 4
D Panel zu Scrollpane adden AWT, Swing, JavaFX & SWT 8
T LayoutManager Panel in Scrollpane mittig ausrichten AWT, Swing, JavaFX & SWT 2
E JList in ScrollPane auf größe bringen AWT, Swing, JavaFX & SWT 5
A ScrollPane + internalFrame AWT, Swing, JavaFX & SWT 2
H ScrollPane scrollt ungefragt drauf los! AWT, Swing, JavaFX & SWT 5
T ScrollPane scrollt nicht einwandfrei AWT, Swing, JavaFX & SWT 3
G ScrollPane: getPreferredSize() AWT, Swing, JavaFX & SWT 11
M Labels in ScrollPane mit Linie verbinden AWT, Swing, JavaFX & SWT 2
P ScrollPane klappt zusammen beim verkleinern des Frames AWT, Swing, JavaFX & SWT 2
S Swing JTree in ScrollPane einen ToolTip geben AWT, Swing, JavaFX & SWT 2
T ScrollBar aus ScrollPane verstecken AWT, Swing, JavaFX & SWT 2
N ScrollPane in ein Fenster einfügen AWT, Swing, JavaFX & SWT 2
N ScrollPane passt sich nicht an AWT, Swing, JavaFX & SWT 4
D ScrollPane Anpassungen AWT, Swing, JavaFX & SWT 7
M Problem mit jPanel (FlowLayout) in ScrollPane AWT, Swing, JavaFX & SWT 4
K TextArea auf Scrollpane AWT, Swing, JavaFX & SWT 3
G Tabellenköpfe trotz Scrollpane ausschalten AWT, Swing, JavaFX & SWT 5
P Automatisches Mitscrollen der ScrollPane AWT, Swing, JavaFX & SWT 2
M Problem beim Einsatz von ScrollPane (Fenster spielt verrückt AWT, Swing, JavaFX & SWT 2
R ImageViewer - Bild mit ScrollPane AWT, Swing, JavaFX & SWT 4
K Row und ColumnHeader in ScrollPane werden "verwischt&qu AWT, Swing, JavaFX & SWT 4
F Resize in ScrollPane AWT, Swing, JavaFX & SWT 4
M Swing: ScrollPane Button mit Pfeil ändern wie? AWT, Swing, JavaFX & SWT 2
F Scrollpane scrollt immer zur TextArea AWT, Swing, JavaFX & SWT 8
vogella JTable und JScrollPane - ScrollPane immer in der Mitte AWT, Swing, JavaFX & SWT 2
B Komponenten über ScrollPane hinaus angezeigt. AWT, Swing, JavaFX & SWT 3
S JTable (Scrollpane und ColumnNames) und JComboBox AWT, Swing, JavaFX & SWT 2
T Warum keine ScrollBars in diesem ScrollPane? AWT, Swing, JavaFX & SWT 3
A Scrollspeed bei Scrollpane erhöhen? AWT, Swing, JavaFX & SWT 2
A Scrollpane verschmiert beim scrollen AWT, Swing, JavaFX & SWT 5
P Resize von ScrollPane Inhalten AWT, Swing, JavaFX & SWT 2
S ScrollPane zeigt scrollbalken nicht an AWT, Swing, JavaFX & SWT 12
S Problem mit Scrollpane & Bild AWT, Swing, JavaFX & SWT 3
A JTable in ScrollPane scrollt nicht horizontal AWT, Swing, JavaFX & SWT 2
M JMenu verschwindet unter ScrollPane AWT, Swing, JavaFX & SWT 3
G jTable + ScrollPane (+ TableModel) AWT, Swing, JavaFX & SWT 7
G ScrollPane anfärben AWT, Swing, JavaFX & SWT 2
E Ärger mit ScrollPane, JTable und der Resize-Einstellung AWT, Swing, JavaFX & SWT 2
J Inhalt eines Scrollpane speichern AWT, Swing, JavaFX & SWT 3
M Eigen gemaltes JPanel im ScrollPane. klappt nicht. :-( AWT, Swing, JavaFX & SWT 10
M Wo bleibt mein ScrollPane? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben