Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Crear y mover objetos en tiempo de ejecución

Crear y mover objetos en tiempo de ejecución

Autor jc mouse domingo, enero 19, 2014

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

The Big

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

bolivia 77

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

GUI

Proyecto

IDE: Netbeans 7.3

Nivel: Intermedio

Link de descarga

Enjoy 🙂

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

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! :)

También Te Podría Interesar

GraphADT: Clases para trabajar con grafos en java

GraphADT: Clases para trabajar con grafos en java

GraphADT es una proyecto alojado en github escrito en java que te permite trabajar con grafos, a la fecha de escribir es...

Ejecutables con Launch4J

Ejecutables con Launch4J

Launch4j es un software OpenSource hecho en Java que permite crear ejecutables para programas escritos en ese mismo leng...

JSpinner: Cambiar color de fondo y fuente

JSpinner: Cambiar color de fondo y fuente

Un JSpinner es un componente swing de java con una caja de texto y un par de botones que nos permiten incrementar  y dec...

MariaDB: Tablas Virtuales (Vistas – View)

MariaDB: Tablas Virtuales (Vistas – View)

¿Qué es una vista? Una vista (View) o Tabla Virtual, es una forma lógica de ver los datos ubicados en varias tablas, es...

Reconocimiento Óptico de Caracteres con Tess4J

Reconocimiento Óptico de Caracteres con Tess4J

El reconocimiento óptico de caracteres o OCR (Optical Character Recognition), es un proceso dirigido a la digitalización...

Encriptación por el método bífido

Encriptación por el método bífido

El método Bífido es un cifrado fraccionario. Es decir que cada letra viene representada por una o más letras o símbolos,...

26 comentarios en “Crear y mover objetos en tiempo de ejecución”

  1. junior dice:

    maestro el post 4 porfavor que estoy siguiendo este proyecto gracias

  2. smith dice:

    y si quisiera hacerlo con cadenas, por ejemplo ponerle color por estado del pedido… si es pendiente rojo… como lo haria??

  3. Anderson Montañez dice:

    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)

  4. jose dice:

    Mouse aun no ha subido en link de descarga !

  5. Richii dice:

    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

    1. Mouse dice:

      que error es el que obtienes al tratar de compilar

  6. xavi dice:

    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.

  7. annan dice:

    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

    1. Mouse dice:

      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

  8. Julián Quiroz dice:

    Muy bueno, muchas gracias…

  9. Edgar dice:

    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

    1. Mouse dice:

      ¿obtienes algún error?

  10. Carlos Cruz dice:

    Excelente Tuto….para poder iniciar esta perfecto!!!!!

  11. Carlos Pino dice:

    Funciona muy bien!! muchas gracias por el ejemplo!!

  12. Jos84 dice:

    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.
    ♜♞♝♚♛♝♞♜
    ♟♟♟♟♟♟♟♟
    .▓░▓░▓░▓░▓░▓░
    ░▓░▓░▓░▓░▓░▓
    ▓░▓░▓░▓░▓░▓░
    ░▓░▓░▓░▓░▓░▓
    ♙♙♙♙♙♙♙♙
    ♖♘♗♔♕♗♘♖

  13. Roger dice:

    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.

  14. milo dice:

    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..

  15. Jhoan dice:

    ejemplo de buena practica gracias

  16. Giovanni dice:

    Como hago para que los componentes insertados esten por encima de los anteriores y no al reves

    1. Mouse dice:

      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

  17. Edwin García dice:

    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..

  18. Marcos dice:

    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.

    1. Mouse dice:

      POO, puedes hacer una clase base y luego clases hijas según tus necesidades

  19. Will dice:

    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 :);

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

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...

Herramientas

Generador de Enlaces a Whatsapp