Hi,

I am trying to figure out how to zoom relative to the mouse pointer position. 
Below, please find my sample code.  When I position the mouse pointer on one 
corner of the red rectangle and use the mouse wheel, I am able to zoom in and 
out as expected. As soon as I move the pointer position, let's say to another 
corner of the red rectangle, and try to zoom in or out, my position relative to 
the rectangle shifts around.  I think I may be missing a transform or two. Any 
help is greatly appreciated.

Thanks.

Here is my code:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


@SuppressWarnings("serial")
public class ZoomDemo extends JPanel {
        
        AffineTransform tx = new AffineTransform();

        Rectangle2D.Double rect = new Rectangle2D.Double(100, 100, 20, 30);

        public ZoomDemo() {
                this.addMouseWheelListener(new ZoomHandler());
        }
        
        @Override
        public void paint(Graphics g) {
                super.paint(g);
                Graphics2D g2 = (Graphics2D)g;
                
                Path2D.Double path;
                g2.setColor(Color.RED);
                path = new Path2D.Double(rect,tx);
                g2.draw(path);
        }
        
        
        private class ZoomHandler implements MouseWheelListener {
                
                Point oldPoint = null;
                
                double scale = 1.0;
                
                public void mouseWheelMoved(MouseWheelEvent e) {
                        if(e.getScrollType() == 
MouseWheelEvent.WHEEL_UNIT_SCROLL) {
                                
                                scale += (.1 * e.getWheelRotation());
                                scale = Math.max(0.1, scale);
                                Point p = e.getPoint();
                                
                                tx = 
AffineTransform.getTranslateInstance(p.getX(), p.getY());
                                tx.scale(scale, scale);
                                tx.translate(-p.getX(), -p.getY());
                                
                                ZoomDemo.this.revalidate();
                                ZoomDemo.this.repaint();                        
        
                        }
                }

        }
        
        public static void main(String[] args) {
                
                JFrame f = new JFrame("ZoomDemo");
                ZoomDemo zoomDemo = new ZoomDemo();
                JScrollPane sp = new JScrollPane(zoomDemo);
                f.getContentPane().add(sp);
                f.setSize(500, 500);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
        }

}
[Message sent by forum member 'kouch' (kouch)]

http://forums.java.net/jive/thread.jspa?messageID=275115

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to