Hallo zusammen,
ich hoffe ihr könnt mir helfen ich will eine Zoom Funktion auf mein Model welches sich in einem JPanel Visualisiert schreiben nur geht das nicht so einfach wie ich es mir vorgestellt habe. Drum habe ich ein Prototypen geschrieben und hier geprostet und hoffe einer von euch kann mit helfen.
Im Allgemeinen Funktioniert es schon wenn man auf das Image klickt wird diese neu Skaliert und der Bildpunkt wo man geklickt hat ist nach dem Vergrößern auch immer noch da wo die Maus ist.
Fehler Beschreibung: Sobald ich jedoch an den Randgebieten des Panels Zoome funktioniert es nicht wirklich.
Fehlerfall: Einfach mal nach ganz Rechts unten Scrollen und Zoomen dann Springt das bild und kann mir nicht erklären woran es liegen könnte.
Bin für jede hilfe dankbar.
ich hoffe ihr könnt mir helfen ich will eine Zoom Funktion auf mein Model welches sich in einem JPanel Visualisiert schreiben nur geht das nicht so einfach wie ich es mir vorgestellt habe. Drum habe ich ein Prototypen geschrieben und hier geprostet und hoffe einer von euch kann mit helfen.
Im Allgemeinen Funktioniert es schon wenn man auf das Image klickt wird diese neu Skaliert und der Bildpunkt wo man geklickt hat ist nach dem Vergrößern auch immer noch da wo die Maus ist.
Fehler Beschreibung: Sobald ich jedoch an den Randgebieten des Panels Zoome funktioniert es nicht wirklich.
Fehlerfall: Einfach mal nach ganz Rechts unten Scrollen und Zoomen dann Springt das bild und kann mir nicht erklären woran es liegen könnte.
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.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
public class ZoomDemo extends JFrame implements MouseListener {
class ImagePanel extends JPanel{
private BufferedImage image;
{
setPreferredSize(new Dimension(1000,1000));
setBackground(Color.BLUE);
image = new BufferedImage(1000,1000,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
for (int i=0;i<100;i++)
g.drawRect((int)(Math.random()*900),
(int)(Math.random()*900),100,100);
}
public void paint(Graphics g){
g.drawImage(image,0,0,getWidth(),getHeight(),null);
}
}
private JScrollPane sp = new JScrollPane();
private JViewport vp = sp.getViewport();
private JPanel pn = new JPanel();
private ImagePanel im = new ImagePanel();
private Dimension dim = new Dimension(1000,1000);
private float scale = 1.0f;
public ZoomDemo(){
setTitle("Zoom-Demo");
setSize(800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pn.setLayout(new GridBagLayout());
pn.add(im);
im.addMouseListener(this);
sp.setViewportView(pn);
getContentPane().add(sp);
setVisible(true);
}
public void mouseClicked(MouseEvent e) {
Point p1,np,dp;
p1 = e.getPoint();
p1.x /= scale;
p1.y /= scale;
if (e.getButton() == MouseEvent.BUTTON1) scale+=0.2f;
if (e.getButton() == MouseEvent.BUTTON3) scale-=0.2f;
if (scale<0.2) scale = 0.2f;
scale = (float)((int)(scale*10))/10;
im.setPreferredSize(new Dimension((int)(dim.width*scale),
(int)(dim.height*scale)));
dp = new Point();
dp.x = e.getPoint().x - im.getVisibleRect().x;
dp.y = e.getPoint().y - im.getVisibleRect().y;
np = new Point();
np.x = (int) (p1.x*scale - dp.x);
np.y = (int) (p1.y*scale - dp.y);
vp.setViewPosition(np);
im.updateUI();
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
public static void main(String[] args) {
new ZoomDemo();
}
}
Bin für jede hilfe dankbar.