0

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;
    }
}
João Marques
  • 121
  • 1
  • 1
  • 14

0 Answers0