Zoom com a rodinha do mouse [RESOLVIDO]

Minha imagem está num JLabel.
Estou usando esse metódo para dar zoom na minha imagem e funciona perfeitamente.

[code] private void showImageZoomIn(URL imageURL, BufferedImage image) {

     int zoomwidth = image.getWidth() *2;
     int zoomheight = image.getHeight() *2;

     Image img = new ImageIcon(image).getImage().getScaledInstance(zoomwidth, zoomheight, Image.SCALE_DEFAULT);

     imageLabel.setText(null);
     imageLabel.setIcon(new ImageIcon(img));
     imageLabel.repaint();
     imageLabel.validate();

}[/code]

Só que eu preciso dar zoom quando o usuário mexer na barra de rolagem do mouse.
Alguém sabe como fazer isso?

Obrigado

Você precisa registrar um MouseWheelListener no seu componente. E então tratar o evento para chamar esse método.

painel.addMouseWheelListener(new MouseWheelListener() {
  public void mouseWheelMoved(MouseWheelEvent e) {
    // ...
  }
});

Eu nunca usei o MouseWheelListener.
Vc teria algum exemplo para me mostrar?

Roger, eu add meu jlabel em um JScrollPane.
Daria pra eu usar addMouseWheelListener no JScrollPane tbm?

O método addMouseWheelListener() pertence à classe Component, que por sua vez é ancestral de JScrollPane, então você pode usar o método com JScrollPane também. Porém, JScrollPane já possui processamento padrão para a roldana do mouse, então você pode querer desligar esse processamento através de JScrollPane.setWheelScrollingEnabled(false).

Não está funcionando Roger.
Eu rodo a barrinha de rolagem do mouse e não acontece nada.
Estou chamando meu método acima para fazer o zoom.

[code] scrollPane.setWheelScrollingEnabled(false);

    scrollPane.addMouseWheelListener(new MouseWheelListener(){
        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
				// TODO Auto-generated method stub
            if(e.isAltDown())
            {
                 try {

                    //Pega o nome da imagem que o usuario quer fazer zoom
                    String nomeImagem = m_imageURL.toString();
                    int indiceBarra = nomeImagem.lastIndexOf("/") + 1;
                    int tamanhoString = nomeImagem.length();
                    String arq = nomeImagem.substring(indiceBarra, tamanhoString);

                    String caminho = m_imageURL.toString();
                    URL url = new URL(caminho);

                    File fileImg = new File("img/" + arq);

                    BufferedImage image = ImageIO.read(fileImg);

                    showImageZoomIn(url, image);


            } catch (Exception ex) {
                System.out.println("erro = " + ex);
            }
            }

        }
});[/code]

O que eu estou fazendo de errado?

Você já verificou se o método está efetivamente sendo executado? Vejo que você está usando isAltDown(), você quer fazer zoom apenas quando o usuário segurar a tecla Alt?

Hum…então não é o isAltDown que eu devo usar.
Qual eu devo usar então Roger?

Obrigado

Consegui,
Usei if(e.getWheelRotation()<0)
Valeu Roger.
Valeu Vinny.
Brigadão.

Abraço

O método que estou usando está mto lento pra dar zoom.
Porque ele carrega a imagem novamente.
Vcs sabem outra maneira para dar zoom?

Não faça ImageIO.read() toda vez, certamente vai ficar lento. Carregue a imagem uma única vez (por exemplo, quando o usuário pedir para abri-la) num objeto BufferedImage e use esse objeto para fazer o zoom.

Eu fiz um if pra carregar só uma vez.

[code] if(zoomInInt == 0)
{
image = ImageIO.read(fileImg);
}

                showImageZoomIn(url, image);[/code]

Realmente ficou mais rápido.
Mas ainda preciso melhorar.
Preciso deixar meu zoom parecido com o programa do windows “galeria de fotos”.

Meu codigo pra dar o zoom está assim:

[code]
private void showImageZoomIn(URL imageURL, BufferedImage image)
{
int zoomwidth = image.getWidth() * 2;
int zoomheight = image.getHeight() * 2;
zoomInInt++;

     Image img = new ImageIcon(image).getImage().getScaledInstance(zoomwidth, zoomheight, Image.SCALE_DEFAULT);

     imageLabel.setText(null);
     imageLabel.setIcon(new ImageIcon(img));
     imageLabel.repaint();
     imageLabel.validate();
     return;

}[/code]

Vc sabe como deixar o zoom ainda mais rápido roger?

Obrigado

Algumas dicas:

  • Creio que o trecho " imageLabel.setText(null) " pode ser removido, provavelmente imageLabel já não possui texto algum;
  • A rotina showImageZoom() está sendo chamada a partir do MouseWheelListener? Caso positivo, como o MouseWhellListener é chamado a partir da Thread de processamento de eventos do Swing, as chamadas a " imageLabel.repaint() " e " imageLabel.validate() " não são necessárias;
  • O " return " no fim da rotina também pode ser retirado;
  • Tentar usar Graphics.drawImage() em vez de getScaledInstance() para redimensionar a imagem. Há um exemplo dessa técnica no link abaixo:

http://www.componenthouse.com/article-20

O código de interesse está na seção “First Attempt”, é o trecho que segue:

private static BufferedImage resize(BufferedImage image, int width, int height) { BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = resizedImage.createGraphics(); g.drawImage(image, 0, 0, width, height, null); g.dispose(); return resizedImage; }

Caraca Roger, ficou show o meu zoom agora.
Brigadão cara.
Quebrou mó galhão.

Abraço

Grato em ter sido útil :slight_smile: Uma última recomendação: inclua a tag “[RESOLVIDO]” no título deste tópico, para que os demais participantes do fórum possam realizar consultas com mais facilidade.