Zoom

2 respostas
Rummenigge

Pessoal, queria saber como faço para dar um zoom em um painel sem modificar as propriedades dos gráficos contidos nele.

Por exemplo: Eu tenho uma imagem pintada no centro de um painel, e quero que quando acontecer um mouseWheelMoved, o JScrollPane dê uma aproximada nos gráficos.

Existe alguma técnica para isso sem mexer no estado dos componentes pintados? Alguém tem um tutorial ou alguma coisa que ajude?

Se tiver, agradeço.

2 Respostas

C
tenho um exemplo para redimensionar imagens num jlabel se for do mesmo estilo talvez vc possa usar
import java.awt.BorderLayout;
import java.awt.Graphics2D;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main extends JFrame {
    private BufferedImage bi;
    private JLabel jLabel_Imagem;

    public Main() {
        JFileChooser jFileChooser = new JFileChooser();
        jFileChooser.showOpenDialog(null);
        File arquivo = jFileChooser.getSelectedFile();//arquivo

        try {
            bi = ImageIO.read(arquivo); //carrega a imagem real num buffer
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        //cria um jlabel
        jLabel_Imagem = new JLabel();

        //adiciona a acao de resized
        jLabel_Imagem.addComponentListener(new ComponentListener() {
            public void componentResized(ComponentEvent e) {
                atualizarJLabel();
            }

            public void componentMoved(ComponentEvent e) {
            }

            public void componentShown(ComponentEvent e) {
            }

            public void componentHidden(ComponentEvent e) {
            }
        });

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(BorderLayout.CENTER, jLabel_Imagem);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void atualizarJLabel() {
        if (jLabel_Imagem.getSize().width == 0 || jLabel_Imagem.getSize().height == 0) return;
        BufferedImage aux = new BufferedImage(jLabel_Imagem.getSize().width, jLabel_Imagem.getSize().height, bi.getType());//cria um buffer auxiliar com o tamanho desejado
        Graphics2D g = aux.createGraphics();//pega a classe graphics do aux para edicao
        AffineTransform at = AffineTransform.getScaleInstance((double) jLabel_Imagem.getSize().width / bi.getWidth(), (double) jLabel_Imagem.getSize().height / bi.getHeight());//cria a transformacao
        g.drawRenderedImage(bi, at);//pinta e transforma a imagem real no auxiliar
        jLabel_Imagem.setIcon(new ImageIcon(aux));// seta no jlabel
    }
    
    public static void main(String[] args) {
        //teste
        new Main();
    }

}
na linha onde ta
AffineTransform at = AffineTransform.getScaleInstance((double) jLabel_Imagem.getSize().width / bi.getWidth(), (double) jLabel_Imagem.getSize().height / bi.getHeight());//cria a transformacao
modifica o tamanho da imagem entao talvez AffineTransform at = AffineTransform.getScaleInstance(2.0d,2.0d); //amplia 2x AffineTransform at = AffineTransform.getScaleInstance(0.5d,0.5d); //reduz 50%
Rummenigge

Beleza, vou dar uma olhada.

Criado 27 de abril de 2011
Ultima resposta 3 de mai. de 2011
Respostas 2
Participantes 2