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:
Tausend dank für jede Hilfe ....
mfg vrcat
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