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 🙂
Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.
Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye
Enjoy! :)
NUEVA ESPECIFICACIÓN TÉCNICA DEL CÓDIGO DE CONTROL (Ver.7.0) En el marco del Nuevo Sistema de Facturación implementado p...
Control de versiones: Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los eleme...
Utilizando pygame para hacer gráficos en python, se muestra a continuación un sencillo ejemplo de cómo utilizar esta lib...
Un BLOB en SQL es un tipo incorporado que almacena un Objeto Binario Grande como un valor de columna en una fila de una...
Android cuenta con una serie de herramientas en su API para el trabajo con gráficos, entre estos podemos mencionar: Bitm...
El Tangram es un juego chino muy antiguo, esta compuesto por 7 piezas: un paralelogramo (romboide), un cuadrado y 5 triá...
Los comentarios estan cerrados
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...
Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...
maestro el post 4 porfavor que estoy siguiendo este proyecto gracias
y si quisiera hacerlo con cadenas, por ejemplo ponerle color por estado del pedido… si es pendiente rojo… como lo haria??
Eres un barbaro, desde mis inicios siempre he seguido tu trabajo, de verdad me has ayudado mucho y tus enseñanzas han sido de muchísimo beneficio… Exitos y mientras sigas ayudando te seguiré de cerca (Y)
Mouse aun no ha subido en link de descarga !
Hola JC Mouse: Que tal,acabo de realizar este tutorial y esta excelente…pero tengo problemas al tratar de compilar. Desde ya agradesco mucho todo lo que haces.
Saludos de Bs As – Argentina
que error es el que obtienes al tratar de compilar
Haha me gusta la gente que no sabe hacer las cosas, si tu descomprimes un .jar de una decompilación, con winzip te van a dar el código de las clases en null.
Es bonito dar botones cuando no has estudiado del tema, verdad ? pobre infeliz.
o.O
hola, deseo pedirte el favor si esta a tu alcance, tendras alguna idea de como hacer en java la autentificacion de usuarios segun su rol.
estoy haciendo una de una escuela y hay 3 roles, director – secretaria – DEPAE, y cada uno entra al sistema pero con opciones distinatas o mejor dicho con jfranes distintas.
solo me falta eso pero soy muy novato y malo programanado pero con un eemplo puedo adaptarlo al mio y asi solucionar, gracias de antemano. saludos
eso es medio complicado de explicar sin un ejemplo ya que hay muchas maneras de hacer lo que quieres hacer, por ejemplo si las interfaces no cambian para todos los usuarios lo mas sencillo es otorgar permisos a cada usuario y según esos permisos habilitar o deshabilitar controles. Trabajando un poco mas se podrían crear interfaces distintas para cada usuario sin modificar el modelo en si, esto es posible ya que al tener separadas en capas el modelo lógico de la GUI puedes hacer uso de las clases en cualquier interfaz
Muy bueno, muchas gracias…
Hola, buenas tardes.
Muy interesante y buen tutorial….
He seguido al pie de la letra pero no me funciona…
Hay alguna libreria que deba incluir al proyecto?
Gracias de antemano y saludos
¿obtienes algún error?
Excelente Tuto….para poder iniciar esta perfecto!!!!!
Funciona muy bien!! muchas gracias por el ejemplo!!
hola Mouse, sin duda muchos de tus ejemplos me fueron de mucha ayuda este no fue la excepciona sobre todo los conceptos y formas de resolver los problemas.
gracias por tus aportes.
♜♞♝♚♛♝♞♜
♟♟♟♟♟♟♟♟
.▓░▓░▓░▓░▓░▓░
░▓░▓░▓░▓░▓░▓
▓░▓░▓░▓░▓░▓░
░▓░▓░▓░▓░▓░▓
♙♙♙♙♙♙♙♙
♖♘♗♔♕♗♘♖
Como creo el string para la instruccion esta:
Importante, el ID del botón es “btnTomaFoto“, no olvides también crear un string para el texto del botón.
hola mi problema es que ya tengo todo el reporte y subreportes y me funciona bien pero cuando lo compilo dentro del IReport y al Ejecutar la aplicación corre exitosamente y genera los reportes…
El punto es cuando ya tengo la aplicacion terminada y lo ejecuto en otro equipo me sale este error: net.sf.jasperreports.engine.jrexception resource not found at: y la Direccion del archivo que no encuntra he buscado ese error pero he tenido exito haber si puede ayudarme en este error o mostrarme un tutorial de como configurarlo..
ejemplo de buena practica gracias
Como hago para que los componentes insertados esten por encima de los anteriores y no al reves
se muestran en el orden en el que los insertas en el array si quieres enviar un objeto atrás o delante, debes modificar el array
Que tal amigo gracias por tus aportes, tengo una pregunta como haría para eliminar un componente y dejar los demás ahí?.. Gracias por tu ayuda..
Hola buenas tardes
Estoy haciendo un proyecto parecido al tuyo pero necesito generar las imagenes según al botón que pulse y no de forma aleatoria, ¿Se tiene que hacer una clase por cada objeto o se podría con una sola? No logro ver como hacerlo sin hacer clases distintas en las que solo cambie el icono.
POO, puedes hacer una clase base y luego clases hijas según tus necesidades
Buen día:
Estoy haciendo un creador de Diagramas de Flujo siguiendo este proyecto y me gustaría saber cómo se puede eliminar un Objeto Seleccionado.
Gracias :);