Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Crear y mover objetos en tiempo de ejecución

Crear y mover objetos en tiempo de ejecución

Por 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

Artículos similares

Métodos Numéricos: Sustitución Directa

El Método de Sustitución Directa básicamente consiste en asumir un valor, reemplazar el mismo en la función despejada y[...]

Crea y comparte diagramas de base de datos online

En este post les comparto una plataforma en línea diseñada para crear y compartir diagramas de flujo completamente grati[...]

Crea un Tabbed Activity desde cero

Un Tabbed Activity te permite cambiar la vista entre  fragmentos desplazando el dedo  de izquierda a derecha o de derech[...]

Reconocimiento facial con php

Inspeccionando los cientos de marcadores que tenia en mi firefox, me encontre un enlace web con una interesante clase pa[...]

Generar reportes con origen de datos JSON

JSON es un formato de texto ligero para el intercambio de datos ampliamente usado en los Servicios Web. En este post uti[...]

Conexion vb.net y access

Para conectar Visual Basic .NET con una base de datos de MS Access se utiliza la libreria «System.Data.OleDb» en el sigu[...]