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 }