View Javadoc

1   /**
2    * Copyright 2008 WebPhotos
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package net.sf.webphotos.gui;
17  
18  import java.awt.BorderLayout;
19  import java.awt.Container;
20  import java.awt.Dimension;
21  import java.awt.Frame;
22  import java.awt.Graphics;
23  import java.awt.Image;
24  import java.awt.event.ActionEvent;
25  import java.awt.event.ActionListener;
26  import javax.swing.ImageIcon;
27  import javax.swing.JButton;
28  import javax.swing.JDialog;
29  
30  /**
31   * Cria um visualizador de fotos numa janela popup.
32   * Calcula as dimensões da imagem e implementa a imagem na janela.
33   */
34  public class Visualizador extends JDialog implements ActionListener {
35  
36      private Image foto;
37      private int largura;
38      private int altura;
39  
40      /**
41       * Construtor da classe.
42       * Abre a janela popup com a foto.
43       * Recebe um frame para inclusão, nome da foto e um título para a janela.
44       * Testa se é necessário redimensionar a foto, caso positivo chama a função calculaRedução.
45       * Implementa um botão para fechar a janela e por último mostra a tela ao usuário.
46       * @param caminhoImagem Caminho da foto.
47       * @param frame Janela frame para alocar a foto.
48       * @param titulo Título da janela.
49       */
50      public Visualizador(String caminhoImagem, Frame frame, String titulo) {
51          super(frame, titulo, true);
52          Container cp = this.getContentPane();
53  
54          cp.setLayout(new BorderLayout());
55          foto = new ImageIcon(caminhoImagem).getImage();
56          largura = foto.getWidth(this);
57          altura = foto.getHeight(this);
58  
59          // no caso de uma imagem muito grande, utiliza de redução
60          // (por ex. usuário acabou de adicionar uma imagem ao album)
61          if (largura > 550 || altura > 550) {
62              Dimension d = calculaReducao(new Dimension(largura, altura), 550);
63              largura = d.width;
64              altura = d.height;
65          }
66  
67          this.setSize(largura + 10, altura + 60);
68          JButton btFechar = new JButton("fechar");
69          cp.add(btFechar, BorderLayout.SOUTH);
70          btFechar.addActionListener(this);
71          this.setLocationRelativeTo(null);
72          show();
73  
74      }
75  
76      /**
77       * Faz uma redução de dimensão da foto.
78       * Recebe um valor de dimensão e um tamanho máximo.
79       * Faz um cálculo baseado na divisão da largura pela altura para saber se a imagem
80       * está na vertical ou na horizontal, então calcula e retorna a nova dimensão.
81       * @param original Dimensão original.
82       * @param tamMaximo Tamanho máximo da nova dimensão.
83       * @return Retorna a nova dimensão.
84       */
85      public static Dimension calculaReducao(Dimension original, int tamMaximo) {
86  
87          Dimension d = new Dimension();
88          // proporção
89          double p = original.getWidth() / original.getHeight();
90  
91          // imagem horizontal
92          if (p > 1) {
93              d.width = tamMaximo;
94              d.height = (int) (tamMaximo / p);
95  
96              // imagem vertical
97          } else {
98              d.width = (int) (tamMaximo * p);
99              d.height = tamMaximo;
100         }
101         return d;
102     }
103 
104     /**
105      * Faz uma chamada a classe base e pinta todos os componentes.
106      * Esse método não é utilizado.
107      * TODO: avaliar a funcionalidade deste método.
108      * @param g Contexto gráfico.
109      */
110     @Override
111     public void paint(Graphics g) {
112         super.paintComponents(g);
113         g.drawImage(foto, 5, 28, largura, altura, null);
114     }
115 
116     /**
117      * Desabilita a tela.
118      * Desabilita sua visibilidade e encerra seus dados.
119      * Esse método não é utilizado.
120      * TODO: avaliar a funcionalidade deste método.
121      * @param e Evento de ação.
122      */
123     @Override
124     public void actionPerformed(ActionEvent e) {
125         this.setVisible(false);
126         this.dispose();
127     }
128 
129     /**
130      * Método principal.
131      * Cria um objeto {@link java.awt.Dimension Dimension} e seta seus valores.
132      * Logo após utiliza o método calculaRedução da própria classe para reduzir a dimensão original.
133      * Ao final, imprime as duas dimensões.
134      * @param a args do método main.
135      */
136     public static void main(String a[]) {
137         Dimension dim = new Dimension(1154, 1772);
138         Dimension novo = calculaReducao(dim, 550);
139         System.out.println("original:" + dim.toString());
140         System.out.println("reduzido:" + novo.toString());
141     }
142 }