I'm trying to create a kind of zoom whit the mouse wheel. Everytime i move the wheel, teoricaly both the jlable and the image change sizes according(im showing the width value).
Verifiable Example:
Whitout setIcon: Whit setIcon:
Img:144 Img:144
jLable:144 jLable:144
Img:160 Img:144
jLable:160 jLable:144
Img:176 Img:160
jLable:176 jLable:160
Img:192 Img:144
jLable:192 jLable:144
The problem happens when i try insert the image into the jframe:
jLabel1.setIcon(resizedImage);
Can anyone explain me this behavior? It seems for some reason setIcon uses the previous layout, instead of the correct one.
Minimal Version of code:
public void mouseWheelMoved(MouseWheelEvent e) {
int delta = 16 * (int)e.getPreciseWheelRotation();
Dimension factor = new Dimension(jLabel1.getWidth()+delta, jLabel1.getHeight()+delta);
jLabel1.setSize(factor);//force jlabel1 to get the new size
//Relocate Image
Image img = image.ScaleImage(factor);//Teoricaly give the image whit the new size
ImageIcon resizedImage = new ImageIcon(img);
//Gives the image to jlabel
jLabel1.setIcon(resizedImage);
}
});
Complete Version of Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseWheelEvent;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import pokemon.classes.BitmapController;
import pokemon.objects.ResizableImage;
import javax.swing.border.Border;
public class Aplicacao extends javax.swing.JFrame {
public Aplicacao() {
initComponents();
setExtendedState(JFrame.MAXIMIZED_BOTH);
///
BitmapController file = new BitmapController();
ResizableImage image = new ResizableImage(file.readImage());//reads the bmp image
ImageIcon icon = new ImageIcon(image.master);
jLabel1.setIcon(icon);
//Create the Controller for scroll effect
scrollController(image);
}
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Aplicacao().setVisible(true);
}
});
}
public void scrollController(ResizableImage image){
Border border = BorderFactory.createLineBorder(Color.BLUE, 5);
jLabel1.setBorder(border);
jLabel1.addMouseWheelListener(new MouseAdapter() {
public void mouseWheelMoved(MouseWheelEvent e) {
int delta = 16 * (int)e.getPreciseWheelRotation();
Dimension factor = new Dimension(jLabel1.getWidth()+delta, jLabel1.getHeight()+delta);
//jLabel1.setSize(factor);
//Relocate Image
//System.out.println("width: " + image.ScaleImage(factor).getWidth(rootPane));
Image img = image.ScaleImage(factor);
System.out.println("Img:"+img.getWidth(rootPane));
System.out.println("jLable:"+jLabel1.getWidth());
ImageIcon resizedImage = new ImageIcon(img);
jLabel1.setIcon(resizedImage);
}
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(68, 68, 68)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(472, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(74, 74, 74)
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 256, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(143, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
}
////Class ResizableImage
import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.BufferedImage;
public class ResizableImage {
public BufferedImage master;
private Image scaled;
public ResizableImage(BufferedImage master){
this.master=master;
}
public Image ScaleImage(Dimension size){
Image scaledImg = master.getScaledInstance(size.width, size.height,Image.SCALE_DEFAULT);
return scaledImg;
}
}
//Class BitmapController
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class BitmapController {
public BufferedImage readImage(){
BufferedImage image = null;
try{
image = ImageIO.read(new File("D:/Tileset42.bmp"));
//System.out.println("ola");
}catch (Exception ex){ System.out.println("error");}
return image;
}
}