import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileChannel;
import java.io.File;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import pnl_programasion_neurolinguistica.Contenedor_de_imagen;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
*
* @author Rafael Angel Montero Fernández.
*/
public class Reproductor_de_imagenes {
/**
* @param args Para la linea de comandos.
*/
public static void main(String[] args)
{
frmReproductor_de_imagenes frm=new frmReproductor_de_imagenes();
frm.show();
}
}
/*
Esta clase es para copiar las imagenes de una carpeta externa hacia la carpeta de recursos.
*/
class Copiar_archivos
{
/**
* Copia todos los archivos hacia la carpeta destino.
* Ademas, si se copian los archivos dentro del mismo origen entonces se borra su contenido quedando solo los archivos en blanco con su nombre y su formato.
* @param carpeta_origen Es la direccion de la carpeta de origen.
* @param carpeta_destino Es la direccion de la carpeta de destino.
*/
public void copiar_todos_los_archivos(String nueva_carpeta_origen, String nueva_carpeta_destino)
{
try
{
File carpeta_origen=new File(nueva_carpeta_origen);
File carpeta_destino=new File(nueva_carpeta_destino);
if(carpeta_origen.isDirectory()==true)
{
if(!carpeta_destino.exists()==true)
{
carpeta_destino.mkdir();
} //if
String []lista_de_archivos=carpeta_origen.list();
for(int i=0; i<lista_de_archivos.length-1; i++)
{
if( (lista_de_archivos[i].endsWith(".jpg")) || (lista_de_archivos[i].endsWith(".png")) || (lista_de_archivos[i].endsWith(".bmp")) || (lista_de_archivos[i].endsWith(".gif")) )
{
//System.out.println("Copiando " + lista_de_archivos[i]);
copiar_un_archivo(new File(carpeta_origen, lista_de_archivos[i]), new File(carpeta_destino, lista_de_archivos[i]));
}//if
} //for
} //if
else
{
copiar_un_archivo(carpeta_origen, carpeta_destino);
} //else
}catch(Exception ex)
{
System.out.println("Hay errores\n" + ex);
} //catch
} //copiar_todos_los_archivos
/**
* Copia un archivo a la vez hacia la carpeta destino.
* Es una matriz.
* @param mOrigen_destino Es la direccion de la carpeta de origen y la de destino, con el nombre de archivo.
*
*/
public void copiar_un_archivo(String mOrigen_destino[])
{
File carpeta_origen=new File(mOrigen_destino[0]), carpeta_destino=new File(mOrigen_destino[1]);
copiar_un_archivo(carpeta_origen, carpeta_destino);
}
/**
* Copia un archivo a la vez hacia la carpeta destino.
* @param carpeta_origen Es la direccion de la carpeta de origen, con el nombre de archivo.
* @param carpeta_destino Es la direccion de la carpeta de destino, con el nombre de archivo.
*/
public void copiar_un_archivo(File carpeta_origen, File carpeta_destino)
{
/* Thread t=new Thread()
{
@Override
public void run()
{//*/
try
{
//System.out.println("carpeta_origen " + carpeta_origen + "\ncarpeta_destino " + carpeta_destino);
FileChannel in=(new FileInputStream(carpeta_origen).getChannel());
FileChannel out=(new FileOutputStream(carpeta_destino).getChannel());
in.transferTo(0, carpeta_origen.length(), out);
in.close();
out.close();
}catch(Exception ex)
{
System.out.println("Hay errores\n" + ex);
} //catch
/* } //run
};//*/
} //copiar_un_archivo
} //Copiar_archivos
/*
Clase designada para listar los nombres de imagenes.
*/
class Nombres_de_archivos
{
/**
* Es el simbolo \ llamado slash.
*/
public final String slash="\\";//Sirve para obtener toda la ruta.
//Esta propiedad carga la carpeta, la lista de archivos.
//Se hace desde aqui ya que en tiempo de ejecucion puede que se recargue la propiedad.
private String ruta="";
/**
*
* @param nueva_ruta para pasarle la nueva ruta del archivo. Debe ser la misma carpeta donde se compilo el programa.
*/
public void setRuta(String nueva_ruta)
{
this.ruta=nueva_ruta;
this.carpeta=new File(this.ruta);
this.file_lista_de_archivos=carpeta.listFiles();
setLista_de_archivos();
}//setRuta
/**
*
* @return retorna la ruta del archivo, o sea el nombre de carpeta con la direccion completa.
*/
public String getRuta()
{
return this.ruta;
}
//Con esta propiedad se pueden obtener uno a uno los nombres de los archivos. Pero con todo y extencion.
//lista_de_archivos no se pueden agregar directamente los nombres de archivos porque si hay archivos con otros formatos esto causaria espacios nulos en el vector. La solucion será un ArrayList.
private String lista_de_archivos[];
//Se usa un ArrayList porque hay archivos que no cumplen con el formato, entonces el conteo sigue, esta es la solucion.
private ArrayList array_imagenes=new ArrayList();
/**
* Inicializa la lista de todas las imagenes contenidas en la carpeta donde se compiló el programa.
*/
public void setLista_de_archivos()
{
try
{
//Cargando la lista.
int i=0;
for(i=0; i<=file_lista_de_archivos.length-1; i++)
{
if( (file_lista_de_archivos[i].getName().endsWith(".jpg")) || (file_lista_de_archivos[i].getName().endsWith(".png")) || (file_lista_de_archivos[i].getName().endsWith(".bmp")) || (file_lista_de_archivos[i].getName().endsWith(".gif")) )
{
array_imagenes.add(file_lista_de_archivos[i].getName());
}//if
else
{
//this.lista_de_archivos[i]="";//Por el momento. Pero luego se usará un metodo aleatorio para obtener una imagen de alguno de los archivos.
}
}//for
lista_de_archivos=new String[array_imagenes.size()-1];
for(i=0; i<=array_imagenes.size()-1; i++)
{
this.lista_de_archivos[i]=array_imagenes.get(i).toString();
//System.out.println(this.lista_de_archivos[i]);
} //for
}catch(Exception ex){}
}//set
/**
*
* @return retorna un vector con toda la lista de imagenes, incluyendo su extencion.
*/
public String []getLista_de_archivos()
{
//System.out.println(lista_de_archivos[0]);
return this.lista_de_archivos;
}//get
private File carpeta=null;//Se carga en setRuta.
File []file_lista_de_archivos=null;//Se carga en setRuta.
/**
*
* @param nueva_ruta Ruta donde se deben encontrar las imagenes, debe ser la misma del proyecto.
*/
public Nombres_de_archivos(String nueva_ruta )
{
setRuta(nueva_ruta);
}//Constructor
/**
*
* @param id_de_la_imagen indice del nombre de la imagen en el vector.
* @return retorna el nombre de la imagen con la direccion completa de la carpeta.
*/
public String getImagen_con_direccion_completa(int id_de_la_imagen)
{
try
{
return this.carpeta + this.slash + this.getLista_de_archivos()[id_de_la_imagen];
}catch(Exception ex)
{
//Este error solo sucede en caso de no haber ninguna imagen cargada.
}
return "";//No habia imagenes cargadas.
} //getImagen_con_direccion_completa
}//Nombres_de_archivos
/*
Nota importante, las imagenes deben estar en la misma carpeta del proyecto.
En la carpeta donde estan los archivos .java.
No es portable.
Aqui la tactica será una funcion que copie primero todas las imagenes a la carpeta absoluta y luego que las reproduzca.
*/
class Contenedor_de_imagen extends JPanel
{
/**
* Este constructor sirve para un cargado rapido.
*/
public Contenedor_de_imagen()
{
this.setSize(500, 400);
} //Constructor
//Este otro es para insertar la ruta de una vez.
/**
* Es un constructor con 3 parametros.
* @param nueva_ruta Una nueva ruta de alguna carpeta, pero esta debe ser la misma donde se compilo el programa.
* @param nuevo_ancho Nuevo ancho del objeto.
* @param nuevo_alto Nuevo alto del objeto.
*/
public Contenedor_de_imagen(String nueva_ruta, int nuevo_ancho, int nuevo_alto)
{
this.setSize(nuevo_ancho, nuevo_alto);
setRuta(nueva_ruta);
this.archivos.setLista_de_archivos();
} //Constructor
private String vImagen="";
/**
* Repinta la imagen en la pantalla.
*/
public void repintar()
{
repaint();
}//repintar
@Override
public void paint(Graphics nuevo_grafico)
{
graficar(nuevo_grafico,this.vImagen);
}//paint
private Image img=null;//Es mejor la varaible Image porque se carga de una vez.
/**
*
* @param nuevo_grafico se pasa un nuevo grafico por medio de ImageIcon
* @param nombre_de_la_imagen se pasa el nombre de la nueva imagen.
*/
public void graficar(Graphics nuevo_grafico,String nombre_de_la_imagen)
{
try
{
//System.out.println(nombre_de_la_imagen);
img=new ImageIcon(getClass().getResource(nombre_de_la_imagen)).getImage();//ImageIcon(getClass().getResource(nombre_de_la_imagen));
nuevo_grafico.drawImage(img,0,0,this.getWidth(),this.getHeight(),null);//(imagen,0,0,this);
repintar();
}catch(Exception ex)
{
//System.out.println("Errores con graficar\n"+ex);
}
}//graficar
/**
* Clase interna para la secuencia de imagenes a la velocidad que uno quiera.
*/
public class Hilos extends Thread
{
@Override
public void run()
{
try
{
while(true)
{
for(int i=0;i<=archivos.getLista_de_archivos().length-1;i++)
{
//Se usa esta para no copiar los archivos en la misma carpeta de la app.
vImagen=archivos.getLista_de_archivos()[i];//Solo se pueden cargar las imagenes que esten en la misma carpeta.
//System.out.println(archivos.getImagen_con_direccion_completa(i));
repaint();
try{sleep(500);}catch(Exception ex){}
}//for
}//while
}catch(Exception ex)
{
System.out.println(ex.getCause() +"\nDebes conseguirte imagenes con formato jpg o cualquier otro formato, copiarlas a la carpeta donde esta este archivo.\nLuego cambiarles el nombre de la siguiente manera:\n0.jpg, 1.jpg, 2.jpg, 3.jpg");
}//catch
}//run
}//class Hilos
/**
* Inicia la reproduccion de hilos.
* Inicializa el class de los hilos o threads, y empieza la reproduccion.
*/
public void iniciar_reproduccion()
{
Hilos h=new Hilos();
h.start();
} //iniciar_reproduccion
private Nombres_de_archivos archivos=null;
/**
*
* @param nueva_ruta obtiene la ruta del archivo. Aunque he visto que los archivos deben estar en la misma carpeta.
*/
public void setRuta(String nueva_ruta)
{
this.archivos=new Nombres_de_archivos(nueva_ruta);
this.archivos.setLista_de_archivos();//Se inicializa el cargado de imagenes de una vez.
}//setRuta
/**
*
* @return Retorna la ruta del archivo.
*/
public String getRuta()
{
return this.archivos.getRuta();
}
} //Contenedor_de_imagen
/*
Este es el form donde se cargaran las imagenes por medio de los threads. Y de otros objetos.
*/
class frmReproductor_de_imagenes extends JFrame implements ActionListener
{
private JMenuBar jmb=new JMenuBar();
private JMenu jmArchivo=new JMenu("Archivo");
private JMenuItem jmiSalir=new JMenuItem("Salir");
private final String pnl="C:\\Orgon\\IMGs\\Enero 2014";
private final String imagenes_dentro_del_jarro="C:\\Biblioteca de Rafael\\Clases Java hechas por mi\\Reproductor de imagenes\\Reproductor_de_imagenes\\src\\pnl_programasion_neurolinguistica";
private Contenedor_de_imagen imagenes=null;//new Contenedor_de_imagen(imagenes_dentro_del_jarro,300,200);
private Copiar_archivos copiar=new Copiar_archivos();
/**
* frmReproductor_de_imagenes es el constructor de este form.
*/
public frmReproductor_de_imagenes()
{
super("Reproductor de imagenes");
this.setSize(630, 735);
this.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//String m[]={pnl + "\\7dd1174e6e9d85c0231b397f1b369462.jpg", imagenes_dentro_del_jarro + "\\tetona.jpg"};
//copiar.copiar_un_archivo(m);
//copiar.copiar_todos_los_archivos(pnl, imagenes_dentro_del_jarro);
imagenes=new Contenedor_de_imagen(imagenes_dentro_del_jarro,300,200);
imagenes.setBounds(0, 0, 615, 735);
this.add(imagenes);
this.setJMenuBar(jmb);
this.jmb.add(this.jmArchivo);
this.jmArchivo.add(this.jmiSalir);
this.jmiSalir.addActionListener(this);
imagenes.iniciar_reproduccion();
} //Constructor
public void click_salir(ActionEvent e)
{
if (e.getActionCommand().equalsIgnoreCase(this.jmiSalir.getText())==true)
{
System.exit(0);
} //if
}
@Override
public void actionPerformed(ActionEvent e)
{
this.click_salir(e);
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}//frmReproductor_de_imagenes