Je veux agrandir l'image lorsque la souris gauche est clic et à l'extérieur lorsque le clic droit de la souris, c'est la partie facile. La partie de l'image après le zoom que je veux montrer est l'endroit où se trouve la souris. Par exemple une image de voiture et ma position de la souris est sur la roue de voiture l'image devrait zoomer mais la mise au point devrait rester sur la voiture. C'est ce qui est fatigué jusqu'ici.Zoom image in and out change également JscrollPane accroding à la position de la souris
package paractice;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class Zoom extends JPanel implements ActionListener, MouseListener, MouseMotionListener{
private static final long serialVersionUID = 1L;
private JLabel imageAdujuster = new JLabel();
private JPanel panel = new JPanel();
private JScrollPane pane = new JScrollPane();
private JButton zoomIn = new JButton("Zoom IN");
private JButton zoomOut = new JButton("Zoom Out");
private Point point;
private BufferedImage image;
private double scale = 1;
/*
* Constructor
*/
public Zoom() {
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonPanel.add(zoomOut);
buttonPanel.add(zoomIn);
panel.setLayout(new BorderLayout());
panel.add(imageAdujuster, BorderLayout.CENTER);
pane.setViewportView(panel);
pane.setAutoscrolls(true);
setLayout(new BorderLayout());
add(pane, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
zoomOut.addActionListener(this);
zoomIn.addActionListener(this);
imageAdujuster.addMouseListener(this);
imageAdujuster.addMouseMotionListener(this);
}
private void getImage(String imagePath){
try {
File imageFile = new File(imagePath);
image = ImageIO.read(imageFile);
setImage(image);
}catch(Exception e){
System.out.println("Image file not found. "+ e.getMessage());
}
}
private void setImage(Image image) {
imageAdujuster.setIcon(new ImageIcon(image));
}
private BufferedImage getScaledImage(double scale) {
int w = (int)(scale*image.getWidth());
int h = (int)(scale*image.getHeight());
BufferedImage bi = new BufferedImage(w, h, image.getType());
Graphics2D g2 = bi.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
AffineTransform at = AffineTransform.getScaleInstance(scale, scale);
g2.drawRenderedImage(image, at);
g2.dispose();
return bi;
}
public void zoomOut(Point point) {
setImage(getScaledImage(scale * 0.9));
Point pos = pane.getViewport().getViewPosition();
int newX = (int)(point.x*(0.9f - 1f) + 0.9f*pos.x);
int newY = (int)(point.y*(0.9f - 1f) + 0.9f*pos.y);
pane.getViewport().setViewPosition(new Point(newX, newY));
this.pane.revalidate();
this.pane.repaint();
}
/**
*
*/
public void zoomIn(Point point) {
setImage(getScaledImage(scale * 1.1f));
Point pos = pane.getViewport().getViewPosition();
int newX = (int)(point.x*(1.1f - 1f) + 1.1f*pos.x);
int newY = (int)(point.y*(1.1f - 1f) + 1.1f*pos.y);
pane.getViewport().setViewPosition(new Point(newX, newY));
this.pane.revalidate();
this.pane.repaint();
}
public static void main(String args[]) {
JFrame frame = new JFrame();
Zoom zoom = new Zoom();
zoom.getImage("C:\\Users\\abcd1\\Pictures\\picture.jpg");
frame.getContentPane().add(zoom);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == zoomIn) {
scale ++;
zoomIn(point);
}
if(e.getSource() == zoomOut) {
scale --;
zoomOut(point);
}
}
public void mouseClicked(MouseEvent e) {
if(SwingUtilities.isLeftMouseButton(e)) {
scale += 1;
zoomIn(point);
}
if(SwingUtilities.isRightMouseButton(e)) {
scale -= 1;
zoomOut(point);
}
}
public void mouseMoved(MouseEvent e) {
PointerInfo info = MouseInfo.getPointerInfo();
point = info.getLocation();
System.out.println("point x is "+point.x +" point y is "+point.y);
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
public void mouseDragged(MouseEvent e) {}
}
Merci d'avance.
ne serait-ce rien que l'élaboration de la géométrie sur le papier? –
[Cet exemple] (https://stackoverflow.com/questions/12719085/how-to-zoom-in-to-jpanel-without-moving-the-center-math-or-swing/12719389#12719389) est légèrement différent, en ce sens qu'il s'échelonne autour du centre de la zone visible actuelle, mais pourrait vous donner quelques idées. Peut-être que [cet exemple] (https://stackoverflow.com/questions/15699916/how-do-i-make-this-panel-zoom-toward-the-middle-of-the-panel/15700496#15700496) pourrait aider – MadProgrammer
L'idée générale est que, lorsque vous mettez à l'échelle l'image, vous devez appliquer un décalage de la moitié de la taille résultante à l'emplacement de l'image, qui, en théorie, doit évoluer autour de la zone visible visible. Vous devrez également prendre en considération le décalage de la zone visible et le pointeur de la souris et faire des ajustements à cela aussi bien – MadProgrammer