Warum steigt der MouseWheelListener aus?

vrcat

Mitglied
Hallo zusammen,

ich versuche gerade die ZOOM-Funktionalität meines Graphen auf das Mausrad zu legen und habe mir dafür einen kleinen Prototyp geschrieben. Nun musste ich aber feststellen, dass es scheinbar nicht so einfach geht wie ich dachte.
Solange die Scrollbars der der JScrollpane sichtbar sind funktioniert es wie ich es wollte. Nur wenn ich nun soweit raus ZOOMe das die Scrollbars nicht mehr nötig sind und ich den ganzen Graphen sehe funktioniert das Mausrad nicht mehr.
Ich hoffe ihr könnt mir helfen da ich derzeit nicht mehr weiter weis ….

Hier mal der Prototyp:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

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

public class TestFrame extends JFrame implements MouseWheelListener,
									     MouseListener {
	
	private boolean	doRepaint = true;
	
	public Point	delta	  = new Point();
	public float	scale	  = 1.0f;
	
	public class ImagePanel extends JPanel {
		
		public void paint(Graphics g){
			if (!doRepaint) return;
			g.setColor(Color.WHITE);
			g.fillRect(0,0,getWidth(),getHeight());
			g.setColor(Color.BLACK);
			float step_x = (float)(getWidth()-1) /10;
			float step_y = (float)(getHeight()-1)/10;
			
			for (float x = 0;x < getWidth(); x+=step_x){
				for (float y = 0;y < getWidth(); y+=step_y){
					g.drawLine(Math.round(x),0,Math.round(x),getHeight());
					g.drawLine(0,Math.round(y),getWidth(),Math.round(y));					
				}
			}
			
			g.fillRect((int)(560*scale),(int)(660*scale),
					   (int)(10*scale),(int)(10*scale));
			
		}
			
	}
	
	private JPanel 		graph      = new ImagePanel();
	private JPanel		dk	     = null;
	private JScrollPane spane	= null;
	
	private Dimension	org		= new Dimension(1200,1000);
	
	public TestFrame(){
		setName("Test-Frame pro1");
		setSize(800,600);
		
		graph.setPreferredSize(new Dimension(1000,1200));
		graph.setBackground(Color.WHITE);
		
		dk = new JPanel(new GridBagLayout());
		dk.add(graph);
		getContentPane().add(spane = new JScrollPane(dk));
		
		graph.addMouseWheelListener(this);		
		graph.addMouseListener(this);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}

	public static void main(String[] args) {
		new TestFrame();
	}

	public void mouseWheelMoved(MouseWheelEvent e) {
		zoom(e.getPoint(), e.getWheelRotation());
	}
	
	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
	 */
	public void mouseClicked(MouseEvent e) {
		zoom(e.getPoint(), -(e.getButton()-2));
		System.out.println(e.getButton()-2);
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
	 */
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
	 */
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
	 */
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
	 */
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	private void zoom(Point zoomPoint,int outIn){
		// Initialisieren der Zoom-Variablen -----------------------------
		Dimension d   = graph.getPreferredSize();
		float	  vw  = (float)graph.getVisibleRect().getWidth() /2.0f;
		float	  vh  = (float)graph.getVisibleRect().getHeight()/2.0f;
		float	  ds  = 0;		
		Point 	  c   = zoomPoint;
		Point 	  pos = new Point();
		Point  	  m   = new Point((int)(vw+graph.getVisibleRect().x),
								  (int)(vh+graph.getVisibleRect().y));
		// Scalierung des Mittelpunkts zurücksetzen ----------------------
		float m_x	= (float)m.x/scale;
		float m_y	= (float)m.y/scale;
		// Neu Scalieren des Graphen je nach Richtung --------------------
		int	  w_o	= d.width;
		if (outIn>0) d.width += 20*scale; else d.width -= 20*scale;
		// Skalierung zu klein Zoom-Funktion Abbrechen --------------
		if (d.width<200){
			d.width = w_o;
			return;
		}
		scale 	= (float)(d.width)/(float)(org.width);
		ds 	  	= (float)(d.width)/(float)(getPreferredSize().width);
		d.height= (int)  (org.height*scale);
		// Berechnen der selbst Zentrierung beim Zoomen ------------------
		c.x = (int) ((-m.x + c.x)*ds/2);
		c.y = (int) ((-m.y + c.y)*ds/2);
		// Setzen des Viewports auf neue Werte ---------------------------		
		spane.getViewport().setView(spane.getViewport().getView());		
		if ((spane.getHorizontalScrollBar().isVisible())||
			(spane.getVerticalScrollBar().isVisible())){	
			// Berechnen der Vieport Position ----------------------------
			pos.x = (int) ((m_x * scale) - vw)+c.x;
			pos.y = (int) ((m_y * scale) - vh)+c.y;
			spane.getViewport().setViewPosition(pos);
		}		
	}
}

Tausend dank für jede Hilfe ....
mfg vrcat
 
Zurück