Dando respuesta a una interrogante sobre el como crear objetos en tiempo de ejecución y como manipular estos, desarrolle un pequeño sistema que crea objetos JLabel con imágenes y los coloca en un JPanel (contenedor) estos ademas se encuentran representados en un JList pudiendo seleccionar cualquier de ellos en cualquier momento, los Jlabel también pueden manipularse directamente, en este ejemplo mover los JLabel con la ayuda del mouse.
A continuación una imagen y video del resultado final
No se explicara en este post el desarrollo paso a paso de esta aplicación por factores de tiempo sin embargo se deja el detalle de la estructura del proyecto en Netbeans, las clases utilizadas y al final, el código fuente completo.
El proyecto esta compuesto por tres clases
– MiObjeto.java Se extiende de un JLabel e implementa MouseListener, MouseMotionListener
– MiSistema.java Es la clase encargada de gestionar los objetos
– Interfaz.java Es un JFrame y como su nombre indica es la interface grafica de la aplicación
Clase MiObjeto.java
01 import java.awt.Cursor; 02 import java.awt.Dimension; 03 import java.awt.Point; 04 import java.awt.event.MouseEvent; 05 import java.awt.event.MouseListener; 06 import java.awt.event.MouseMotionListener; 07 import javax.swing.BorderFactory; 08 import javax.swing.ImageIcon; 09 import javax.swing.JLabel; 10 /** 11 * @web https://www.jc-mouse.net/ 12 * @author Mouse 13 */ 14 public class MiObjeto extends JLabel implements MouseListener, MouseMotionListener{ 15 16 /** Identificador de objeto */ 17 private String key = ""; 18 /** Posicion de imagen */ 19 private Point posicion = new Point(0,0); 20 /** Tamaño de imagen */ 21 private Dimension d = new Dimension(124,150); 22 /** variable que sirve para calcular el movimiento del objeto */ 23 private Point start_loc; 24 /** variable que sirve para calcular el movimiento del objeto */ 25 private Point start_drag; 26 /** variable que sirve para calcular el movimiento del objeto */ 27 private Point offset; 28 /** variables auxiliares para el desplazamiento del objeto*/ 29 private int nuevo_X = 1; 30 private int nuevo_Y = 1; 31 32 /** 33 * Constructor de clase 34 */ 35 public MiObjeto(String key ){ 36 //se inician propiedades de objeto 37 this.key = key; 38 this.setToolTipText( key ); 39 this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); 40 this.setSize(d); 41 this.setPreferredSize(d); 42 this.setIcon( new ImageIcon(getClass().getResource("/org/bolivia/app/res/" + ((int) Math.floor(Math.random()*4+1)) + ".png")) ); 43 this.setText(""); 44 this.setVisible( true ); 45 this.setLocation( posicion ); 46 //se agregan los listener 47 this.addMouseListener(this); 48 this.addMouseMotionListener(this); 49 50 } 51 52 public String getKey() { 53 return key; 54 } 55 56 public void setKey(String key) { 57 this.key = key; 58 } 59 60 @Override 61 public void mouseClicked(MouseEvent e) {} 62 63 @Override 64 public void mousePressed(MouseEvent e) { 65 this.start_drag = getScreenLocation(e); 66 this.start_loc = this.getLocation(); 67 } 68 69 @Override 70 public void mouseReleased(MouseEvent e) { 71 nuevo_X = (this.getLocation().x); 72 nuevo_Y = (this.getLocation().y); 73 this.setLocation( nuevo_X, nuevo_Y ); 74 } 75 76 @Override 77 public void mouseEntered(MouseEvent e) { 78 this.setBorder(BorderFactory.createLineBorder(new java.awt.Color(204, 0, 51), 1)); 79 } 80 81 @Override 82 public void mouseExited(MouseEvent e) { 83 this.setBorder( null ); 84 } 85 86 @Override 87 public void mouseDragged(MouseEvent e) { 88 Point current = this.getScreenLocation(e); 89 offset = new Point((int) current.getX() - (int) start_drag.getX(),(int) current.getY() - (int) start_drag.getY()); 90 Point new_location = new Point((int) (this.start_loc.getX() + offset.getX()), (int) (this.start_loc.getY() + offset.getY())); 91 this.setLocation(new_location); 92 } 93 94 @Override 95 public void mouseMoved(MouseEvent e) {} 96 97 98 /** 99 * metodo para obtener la posicion del frame en la pantalla 100 * @param MouseEvent evt 101 */ 102 private Point getScreenLocation(MouseEvent evt) { 103 Point cursor = evt.getPoint(); 104 Point target_location = this.getLocationOnScreen(); 105 return new Point((int) (target_location.getX() + cursor.getX()), 106 (int) (target_location.getY() + cursor.getY())); 107 } 108 109 }//-> fin clase
Clase MiSistema.java
01 import java.util.HashMap; 02 import java.util.Iterator; 03 import java.util.Map; 04 import javax.swing.DefaultListModel; 05 import javax.swing.ImageIcon; 06 import javax.swing.JPanel; 07 /** 08 * @web https://www.jc-mouse.net/ 09 * @author Mouse 10 */ 11 public class MiSistema { 12 13 /** COntador interno de objetos */ 14 private int contador_de_objetos = 0; 15 /** Los objetos se almacenaran en un MAP */ 16 private Map map = new HashMap(); 17 /** JPanel */ 18 private JPanel contenedor; 19 /** DefaultListModel */ 20 private DefaultListModel listModel; 21 22 /** Constructor de clase 23 * @param JPanel Donde se colocaran los objetos 24 * @param DefaultListModel Aqui se almacenaran los key (identificadores) de objetos 25 */ 26 public MiSistema(JPanel jpanel , DefaultListModel listModel ){ 27 this.contenedor = jpanel; 28 this.listModel = listModel; 29 } 30 31 /** 32 * Metodo que crea un nuevo objeto 33 */ 34 public void Nuevo_Objeto() 35 { 36 //aumenta contador en +1 37 this.contador_de_objetos +=1; 38 //Crea una nueva instancia de "MiObjeto" 39 MiObjeto tmp = new MiObjeto( "Objeto " + this.contador_de_objetos ); 40 //coloca al objeto creado en una posicion aleatoria 41 tmp.setLocation( rndNum( this.contenedor.getWidth() - tmp.getWidth() ) , rndNum(this.contenedor.getHeight()-tmp.getHeight() ) ); 42 //agrega el objeto en el MAP 43 map.put("Objeto " + this.contador_de_objetos, tmp ); 44 //agrega el KEY en el List 45 listModel.addElement( "Objeto " + this.contador_de_objetos ); 46 //agrega el objeto en el JPanel 47 this.contenedor.add(tmp); 48 //actualiza graficos 49 this.contenedor.repaint(); 50 } 51 52 /** 53 * Metodo que cambia la imagen actual de un objeto por otra imagen aleatoria 54 * @param String Key identificador de objeto 55 */ 56 public void Cambiar_Imagen( String key ) 57 { 58 MiObjeto tmp = (MiObjeto) map.get( key ); 59 tmp.setIcon( new ImageIcon(getClass().getResource("/org/bolivia/app/res/" + ((int) Math.floor(Math.random()*4+1))+ ".png")) ); 60 tmp.repaint(); 61 } 62 63 /** 64 * Metodo que cambia todas las imagenes de todos los objetos que existan en el MAP 65 */ 66 public void Cambiar_Imagen_all() 67 { 68 Iterator it = map.entrySet().iterator(); 69 while (it.hasNext()) { 70 Map.Entry e = (Map.Entry)it.next(); 71 Cambiar_Imagen( e.getKey().toString() ); 72 } 73 } 74 75 /** 76 * Retorna un numero entero aleatorio entre 0 y un numero pasado como parametro 77 * @param int numero entero 78 */ 79 public int rndNum( int value ){ 80 int num = (int) Math.floor(Math.random()*value+1); 81 return num; 82 } 83 84 }//->fin de clase
Interfaz.java
Proyecto
IDE: Netbeans 7.3
Nivel: Intermedio
Enjoy 🙂
En este post desarrollaremos una aplicación que nos permitirá leer un código QR y capturar la información que contiene y[...]
En este post te hablaremos sobre una interesante herramienta para le lectura y edición de metadatos que no te debe de fa[...]
EL 6 de agosto de cada año se recuerda una de las fechas más importantes de la historia boliviana, porque el 6 de Agosto[...]
La clase Canvas (Lienzo) de Android es una superficie que nos permite pintar figuras, texto e imágenes utilizando para[...]
Problema: Desarrolle un programa en consola con c# para escribir y leer información de un archivo binario. Los datos a e[...]
OS.js a pesar de lo que sugiere su nombre, no es en si un Sistema Operativo, es más, en su web oficial no se nombra por[...]