Visor de Imagenes
Para el visor use un JPanel, sobre el cual se dibuja la imagen, se le aplica un zoom al pulsar el correspondiente boton, mediante el metodo paint(Graphics g).
Esto se logra al llamar a repaint que a su vez llama a paint y este vuelve a pintar la imagen con las nuevas dimensiones.
Ademas agregue la posibilidad de imprimir la imagen mediante la interfece Printable en la clase CuadroImagen, escribiendo el metodo print.
Es bastante basico no obstante para alguien puede servir de ayuda.
CuadroImagen.java
package com.dansan.visor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class CuadroImagen extends JPanel implements Printable{
private float zoom;
private int ancho,alto;
private BufferedImage bufferImagen;
private Image imagen,imagenAux;
private boolean hayFoto = false;
public CuadroImagen(){
this.zoom=0;
this.setBounds(0, 0, 500, 500);
this.setVisible(true);
}
//metodo que coloca la imagen que va ser dibujada
public void setImagen(String dirImg){
this.zoom=0;
try {
this.bufferImagen = ImageIO.read(new File(dirImg));
imagen = bufferImagen;
imagenAux=imagen;
hayFoto = true;
ancho = imagen.getWidth(this);
alto = imagen.getHeight(this);
this.resize();
repaint();
} catch (IOException e) {
e.printStackTrace();
}
}
//metodo paint que dibuja la imagen en el JPanel
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D) g;
if(hayFoto){
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//se anade la foto
g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
g2d.translate(-ancho / 2, -alto / 2);
g2d.drawImage(imagenAux, 0, 0,ancho, alto, this);
setOpaque(false);
}else{
setOpaque(true);
}
super.paintComponent(g2d);
}
//metodos del zoom
public void aumentar(){
this.zoom=(float) (this.zoom + 0.10);
ancho = (int) (imagen.getWidth(this)*(zoom+1));
alto = (int) (imagen.getHeight(this)*(zoom+1));
imagenAux = imagen.getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING);
resize();
repaint();
}
public void disminuir(){
this.zoom= (float) (this.zoom - 0.10);
ancho = (int) (imagen.getWidth(this)*(zoom+1));
alto = (int) (imagen.getHeight(this)*(zoom+1));
imagenAux = imagen.getScaledInstance(ancho, alto, Image.SCALE_AREA_AVERAGING);
resize();
repaint();
}
//redimenzionar
@SuppressWarnings("deprecation")
public void resize(){
this.setPreferredSize(new Dimension(ancho,alto));
this.resize(ancho, alto);
}
//metodo de la interface printable
@Override
public int print(Graphics g, PageFormat pf, int indexPage)
throws PrinterException {
if(indexPage==0){
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.drawImage(imagen, 0, 0, (int)pf.getWidth(),(int) pf.getHeight(), this);
return Printable.PAGE_EXISTS;
}else{
return Printable.NO_SUCH_PAGE;
}
}
public void imprimir(){
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
PageFormat pageFormat = new PageFormat();
pageFormat = job.pageDialog(pageFormat);
// Diálogo para confirmar impresion.
// Devuelve true si el usuario decide imprimir.
if (job.printDialog())
try {
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}
VentanaPrincipal.java
package com.dansan.visor;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class VentanaPrincipal extends JFrame implements ActionListener{
private JPanel pOpciones;
private JButton btnAdel,btnAtras,btnAbrir,btnAumentar,btnDisminuir,btnImprimir;
private File archivo;
private CuadroImagen img;
private JScrollPane scroll;
private String imagenes[];
private ArrayList ListaImagenes;
private String path;
private int numImg;
public VentanaPrincipal(){
super("Mi visor :-)");
setSize(600,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
numImg = 0;
img = new CuadroImagen();
scroll= new JScrollPane(img,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
this.add(scroll,BorderLayout.CENTER);
pOpciones = new JPanel();
btnAdel = new JButton("-->");
btnAtras = new JButton("<--");
btnAumentar = new JButton("+");
btnDisminuir = new JButton("-");
btnImprimir = new JButton("Imprimir");
pOpciones.add(btnAtras);
pOpciones.add(btnAdel);
pOpciones.add(btnAbrir);
pOpciones.add(btnAumentar);
pOpciones.add(btnDisminuir);
pOpciones.add(btnImprimir);
this.add(pOpciones,BorderLayout.SOUTH);
//listeners
btnAtras.addActionListener(this);
btnAdel.addActionListener(this);
btnAbrir.addActionListener(this);
btnAumentar.addActionListener(this);
btnDisminuir.addActionListener(this);
btnImprimir.addActionListener(this);
setLocationRelativeTo(null);
setVisible(true);
}
//metodo de ActionListener
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnAdel){
numImg++;
if(numImg>=ListaImagenes.size())numImg=0;
img.setImagen(path+"/"+ListaImagenes.get(numImg));
}else if(e.getSource()==btnAtras){
numImg--;
if(numImg<0)numImg=ListaImagenes.size() - 1;
img.setImagen(path+"/"+ListaImagenes.get(numImg));
}else if(e.getSource()==btnAbrir){
JFileChooser jfc = new JFileChooser();
int apr = jfc.showOpenDialog(this);
if(apr==jfc.APPROVE_OPTION){
archivo = jfc.getSelectedFile();
imagenes = archivo.getParentFile().list();
ListaImagenes = new ArrayList<String>();
for(String img:imagenes){
if(this.esImagen(img)){
ListaImagenes.add(img);//cargo solo las imagenes
}
}
path = archivo.getParent();
img.setImagen(archivo.getAbsoluteFile().toString());
}
}else if(e.getSource()==btnAumentar){
img.aumentar();
}else if(e.getSource()==btnDisminuir){
img.disminuir();
}else if(e.getSource()==btnImprimir){
img.imprimir();
}
}//funciones getter y setter
public File getArchivo() {
return archivo;
}
public void setArchivo(File archivo) {
this.archivo = archivo;
}
//Comprueba que solo cargue las imagenes
public boolean esImagen(String dirImg){
if(dirImg.lastIndexOf(".jpg")>0||dirImg.lastIndexOf(".png")>0||dirImg.lastIndexOf(".gif")>0||dirImg.lastIndexOf(".jpeg")>0){
return true;
}
return false;
}
}
Main.java
package com.dansan.visor;
public class Main {
public static void main(String[] args) {
VentanaPrincipal vp = new VentanaPrincipal();
}
}
Diagrama generado con ObjectAid
Imagenes del visor ejecutandose
La Descarga
https://drive.google.com/file/d/0B0sBXdZ8aJgdeDIwbUJXU3lmNTg/edit?usp=sharingPara ejecutar en el directorio del archivo tipear:
java -jar visor.jar
Si deseara mostrar en una etiqueta que este arriba del visor el nombre de la foto que estoy visualizando en ese momento como podria hacerlo!
ResponderBorrarHola Daniel, muchas gracias por publicar este código...
ResponderBorrarHola, podrias pasar el proyecto? Soy principiante y no consigo ejecutarlo.
ResponderBorrar