La policia, el FBI u otros organismos similares utilizaban a dibujantes para realizar el «retrato hablado» de algún maleante, con la tecnologia, esto cambio, y se hicieron programas para facilitar este proceso, entre los programas conocidos tenemos a Faces 4.0 (imagen de abajo) este programa en español y bastante facil de usar puede realizar un retrato en pocos minutos.
¿Que tiene que ver este programa con el post?
Pues en este tuto realizaremos un ejemplo sencillo de Faces 4.0 en Java-Netbeans, y tambien lo cito porque a falta de un buen artista, utilizaremos algunas imagenes propias de este programa (para evitar infracción a las derechos de autor)en nuestro proyecto.
¿Que necesitamos?
Comencemos.
1. Crea un nuevo proyecto en netbeans (proyecto: jface), ahora debemos crear la estructura de la aplicación, es la siguiente:
Ahora en el paquete por defecto «jface», crea las siguientes clases:
2. Diseño de la interfaz, nada del otro mundo,agrega dos jPanel al JFrame, con las siguientes dimensiones jPanel1 600×700 y jPanel2 230×700, puedes utilizar layouts para alinearlos
3. Vamos al código, el siguiente paso es un Copy/Paste, sin embargo si quieres aprender de verdad, te aconsejo que heches una mirada al código.
Comencemos por la clase jface_miembro_rostro.java
package jface; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class jface_miembro_rostro { private BufferedImage[] imagen; private URL _url; private int index=1; public jface_miembro_rostro( String miembro){ load_images(miembro); } //carga todas las imagenes en memoria private void load_images( String miembro){ imagen = new BufferedImage[4]; //se llena el buffer con la imagen for(int i=1; i<=3;i++){ try { _url = new URL(getClass().getResource("/imagenes/"+ miembro +"/jface_" + i + ".png").toString()); imagen[i] = ImageIO.read(_url); } catch (IOException ex) {System.out.println(ex); } } } public void setImagen(int index){ this.index = index; } public Image getImagen(){ return imagen[this.index]; } }
Ahora la clase jface_rostro.java
package jface; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; /** * @web http://jc-mouse.blogspot.com/ * @author Mouse */ public class jface_rostro { //Partes del rostro private jface_miembro_rostro cabello; private jface_miembro_rostro cabeza; private jface_miembro_rostro nariz; private jface_miembro_rostro ojos; private jface_miembro_rostro labios; private jface_miembro_rostro mandibula; private jface_miembro_rostro cejas; private jface_miembro_rostro bigote; public jface_rostro(Dimension contendor){ cabello = new jface_miembro_rostro("cabello"); cabeza = new jface_miembro_rostro("cabeza"); nariz = new jface_miembro_rostro("nariz" ); ojos = new jface_miembro_rostro("ojos"); labios = new jface_miembro_rostro("labios" ); mandibula = new jface_miembro_rostro("mandibula" ); cejas = new jface_miembro_rostro("cejas" ); bigote = new jface_miembro_rostro("bigote" ); } //Cambia una parte del rostro //Entrada: Parte-del-rostro_imagen de tipo String public void cambiar_parte_del_rostro(String value){ String[] val = value.split("_");//divide el comando en dos //valores, uno literal y el otro entero if( val[0].equals("nariz")) nariz.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("ojos")) ojos.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("labios")) labios.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("cabello")) cabello.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("cabeza")) cabeza.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("mandibula")) mandibula.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("cejas")) cejas.setImagen( Integer.valueOf(val[1])); else if( val[0].equals("bigote")) bigote.setImagen( Integer.valueOf(val[1])); } public void dibujar(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.drawImage(cabeza.getImagen(),0,0, null); g2.drawImage(mandibula.getImagen(), 0,0, null); g2.drawImage(nariz.getImagen(),0,0, null); g2.drawImage(ojos.getImagen(), 0,0, null); g2.drawImage(labios.getImagen(), 0,0, null); g2.drawImage(cabello.getImagen(), 0,0, null); g2.drawImage(cejas.getImagen(), 0,0, null); g2.drawImage(bigote.getImagen(), 0,0, null); } }
clase jface_panel.java
package jface; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import javax.swing.BorderFactory; import javax.swing.JPanel; /** * @web https://www.jc-mouse.net/ * @author Mouse */ public class jface_panel extends JPanel { private BufferedImage Imagen_en_memoria; private Graphics2D g2d; public jface_rostro rostro; //constructor principal //Input: Dimension del contenedor padre public jface_panel(Dimension d) { this.setSize(d); this.setPreferredSize(d); this.setBorder(BorderFactory.createLineBorder(Color.BLACK)); rostro = new jface_rostro( this.getSize() ); } @Override public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; //imagen en memoria para dibujar en segundo plano Imagen_en_memoria = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB); g2d = Imagen_en_memoria.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(Color.white); g2d.fill(new Rectangle2D.Double(0,0,this.getWidth(), this.getHeight())); rostro.dibujar(g2d); g2d.setFont( new Font("Arial",Font.BOLD, 26) ); g2d.setColor(Color.black); g2d.drawString("jFace - Programado por Mouse ", 20, 30); g2d.drawString("Visitame: https://www.jc-mouse.net/ ", 20, 60); //dibuja toda la imagen g2.drawImage(Imagen_en_memoria, 0, 0, this); } }
Para terminar, debemos añadir un poco de código a la clase interfaz jface.java
Si habres el codigo de la clase, veras algo como esto:
package jface; public class jface extends javax.swing.JFrame { /** Creates new form jface */ public jface() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") /* RESTO DE CODIGO GENERADO POR NETBEANS */
Lo que haremos sera añadir un poco de código, ojo con esto, no es copiary pegar sino cheka el codigo primero, al final debes tener algo como esto:
package jface; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; /** * @web https://www.jc-mouse.net/ * @author Mouse */ public class jface extends javax.swing.JFrame { private jface_panel lienzo; private JButton btn[][]; ActionListener actionListener ; /** Creates new form jface */ public jface() { initComponents(); //Se inicia la interfaz setTitle( "jFace - by Mouse" ); setLocationRelativeTo(null); //se crea instancia a panel y se añade a la interfaz lienzo =new jface_panel( this.jPanel1.getSize() ); this.jPanel1.add(lienzo); //alineacion para jpanel de controles jPanel2.setLayout(new java.awt.GridLayout(8, 3, 5, 5));//alineacion //acciones de los controles "jbutton" para cambiar partes del rostro actionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { String comando = e.getActionCommand(); lienzo.rostro.cambiar_parte_del_rostro(comando); lienzo.repaint(); } }; //matriz de controles de JButton btn = new JButton[8][3]; botones(); } //Crea la matriz de controlos y añade propiedades private void botones() { String action=""; for ( int i=0; i < 8; i++ )//filas { for ( int j=0; j < 3; j++ )//columnas { btn[i][j] = new JButton(); btn[i][j].setSize( new Dimension(70,80) ); btn[i][j].setPreferredSize( new Dimension(70,80) ); btn[i][j].setText(""); btn[i][j].setBackground(Color.white); switch (i){//Nombres de los eventos case 0: action = "ojos"; break; case 1: action = "labios"; break; case 2: action = "nariz"; break; case 3: action = "cabello"; break; case 4: action = "cabeza"; break; case 5: action = "mandibula"; break; case 6: action = "cejas"; break; case 7: action = "bigote"; break; } btn[i][j].setToolTipText(action); btn[i][j].setActionCommand(action + "_" + (j+1) );//se crea comando btn[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/"+action+"/jface_"+(j+1)+"_t.png"))); btn[i][j].addActionListener(actionListener); jPanel2.add(btn[i][j]);//se añade al JPanel contenedor } } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked")
Añadimos algunas librerias y variables, modificamos tambien el constructor de la clase y creamos un metodo privado para crear un array de controles (JButton).
Eso es todo, si terminaste y no tienen ningun error, compila y ejecuta el proyecto, todo el codigo esta comentado si quieres estudiar el codigo no creo que debas tener problemas, sino, preguuuuuuuntame.
Porque no observas el video y ves como quedo 🙂
Enlace de descarga para los más flojos: Codigo Java-Netbeans
Un post cortito de fin de semana 🙂 , este trata de la forma de extraer la información de una base de datos formar una es[...]
La clase Canvas (Lienzo) de Android es una superficie que nos permite pintar figuras, texto e imágenes utilizando para[...]
En este tutorial crearemos un componente swing para java que podremos usar en cualquiera de nuestros proyectos, el compo[...]
«Material Design es una guía integral para el diseño visual, de movimientos y de interacción en distintas plataformas y[...]
Cuando se realizan aplicaciones en java con base de datos y se llega a un punto donde es necesario realizar una consulta[...]
Segunda y ultima parte del post dedicado a la creación de un microservicio en lenguaje java utilizando el framework Spar[...]