Zoom com a rodinha do mouse [RESOLVIDO]

15 respostas
O

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

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();
}

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

Obrigado

15 Respostas

V

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

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

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

O

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

R

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).

O

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.

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);
                }
                }

            }
	});

O que eu estou fazendo de errado?

R

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?

O

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

Obrigado

O

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

Abraço

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?

R

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.

O

Eu fiz um if pra carregar só uma vez.

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

                    showImageZoomIn(url, image);

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:

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;
}

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

Obrigado

R

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; }

O

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

Abraço

R

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.

Criado 28 de agosto de 2009
Ultima resposta 1 de set. de 2009
Respostas 15
Participantes 3