elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [Solución] Enlazar 3 Clases (Referencias)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solución] Enlazar 3 Clases (Referencias)  (Leído 2,428 veces)
EAMP14

Desconectado Desconectado

Mensajes: 11


Ver Perfil
[Solución] Enlazar 3 Clases (Referencias)
« en: 24 Mayo 2014, 06:31 am »

No sé cual sea un nombre apropiado para esta consulta ya que no se que sea la causa, pero la idea es esa, enlazar 3 clases. Después de darle varias vueltas al asunto, no pude figurar que es lo que estoy haciendo mal.

La clase principal (InterfacePrincipal , que es la GUI), crea en tiempo de ejecución y en función a una determinada cantidad, componentes para mostrar la información relacionada a un articulo de venta.

Por lo que dependiendo esta cantidad se crearan tantos objetos sean necesarios de otra clase que describo a continuación:


Clase InformacionArticulo

Código:

// Package e Imports

public class InformacionArticulo extends JPanel{
    
        Carrito carrito = new Carrito();
    
        private JButton jButtonComprar;
        
        String nombre;
        String precio;
 
    public InformacionArticulo(
                
                String nombre ,
                String precio
        
        ){
            
                this.nombre = nombre;
                this.precio = precio;
                
                formato(); // Utilizado para medidas y dar formato a los componentes
    }

    private void formato(){
            
            jButtonComprar.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent evt){
                    carrito.agregar(nombre , precio);
                }
            });
          
            add(jButtonComprar);
    }
}



Full Code: http://pastebin.com/qXrQ0Rf9]http://pastebin.com/qXrQ0Rf9]http://pastebin.com/qXrQ0Rf9


De lo anterior elimine código irrelevante para no hacer tan largo el tema y confundirlos con otros componentes que no vienen al caso. Entonces de la anterior clase lo más importante es el botón jButtonComprar y su Action Performed, el cual al ser presionado se deberá estar cargando información en una tabla de la clase principal (InferfacePrincipal) a traves del médoto agregar() de la clase Carrito


Clase Carrito
Código:

public class Carrito {
    
    InterfacePrincipal gui = new InterfacePrincipal; // *Nota Importante, esta es la clase principal
    
    public Carrito(){}
    
    public void agregar(String nombre , String precio){
        
        String vector[] = {"#", nombre , precio};
        DefaultTableModel modelo = (DefaultTableModel)gui.getModeloTablaCarrito();
        modelo.addRow(vector);

        System.out.println("Termina método agregar");
    }
}



De donde getModeloTablaCarrito() devuelve el modelo de la tabla donde se muestran los articulos agregados al carrito. Posteriormente se agrega una fila con vector como Data al modelo de la tabla que se encuentra en GUI.

Pero el problema está en que no se ve reflejado en la tabla, y he comprobado que el ActionPerformed del jButtonComprar funcionan, las variables nombre y precio son las correctas y pasan correctamente a agregar() de Carrito, e inclusive se imprime "Termina método agregar". Por lo que sé que paso por todo lo anterior dentro de ese método.

*Nota Importante Aquí lo que hice antes fue solo hacer la referencia, es decir, InterfacePrincipal gui; pero obtenia un NullPointerException, que supongo era lógico, por lo que tuve que crear el Objeto, pero de lo que no estoy seguro es si al crear un Objeto InterffacePrincipal, se crea otro totalmente diferente al original de la Clase Principal (GUI)  puesto que dentro del constructor de InferfacePrincipal se inicializan todos los componentes,

Estoy trabjando en NetBeans, y he probado el código para agregar filas con vector como Data dentro de la misma clase principal donde se encuentra la Tabla y funciona correctamente. El problema es que no sé que es lo que está pasando, de la forma que lo estoy haciendo no se refleja en la tabla.

En si, InferfacePrincipal llama a InformacionArticulos el cual llama a Carrito el cual llama a InterfacePrincipal para obtener su Tabla y agregar filas con cierta información..


Notas:
De esta manero creo los Objetos de InformacionArticulo

Código:
private void mostrarProductos(
            JPanel contenedor , JComboBox producto
    ){
        String tipo = producto.getSelectedItem().toString();
        String nombre;
        String existencia;
        String precio;
        String imagen;
        File archivo = new File(generarRutaArchivo(tipo));
        
        int c_Height = 0;
        int c_Articulos = 0;
        
        int cantidadArticulos = getCantidadArticulos(archivo);
        for(int i=0 ; i<cantidadArticulos ; i++){
            
            nombre = getInformacionArchivo(archivo , i , 0);
            existencia = getInformacionArchivo(archivo , i , 1);
            precio = getInformacionArchivo(archivo , i , 2);
            imagen = generarRutaImagen(tipo , nombre);
            
            contenedor.add(new InformacionArticulo(
                    tipo , nombre , existencia , precio , imagen));
            
            c_Height += 300;
            c_Articulos++;
        }
        
        contenedor.setPreferredSize(new Dimension(400 , c_Height));
        contenedor.setLayout(new GridLayout(c_Articulos , 1));
    }


De donde getInformaciónArticulo(File , int , int) va a leer un archivo donde está alojada la información de todos los articulos pertenecientes a una categoria, ejemplo Teclado.

La forma de uso sería:
getInformacionArticulo(ArchivoALeer , NumeroDeLinea , IndiceDeInformacion)

Donde en IndiceDeInformacion.
• 0 = Nombre del articulo
• 1 = Existencias
• 2 = Precio del articulo
• 3 = Descripcion

Entonces por ejemplo si del JComboBox selecciono teclado, llamará al método anteriormente expuesto.



Código:
private void jComboBoxProductosActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        cambiarPanel("Informacion"); // Cambia a un panel donde se mostrará la información de todos los articulso de la categoria seelccionada.
        
        JPanel panel = new JPanel();
        mostrarProductos(panel , jComboBoxProductos);
        
        jScrollPane3.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
        jScrollPane3.setViewportView(panel);
        
        
}

Y una vez se tenga algo como la siguiente imagen al dar click en el botón "Agregar al Carrito", recordando a la clase InformaciónArticulo, especificamente el ActionPerformed del Boton:

Código:
ButtonComprar.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent evt){
                    carrito.agregar(nombre , precio);
                }
            });


Se pasan como argumentos nombre y precio a agregar() de Carrito.

Código:
public void agregar(String nombre , String precio){
              
        String vector[] = {"#", nombre , precio};
        DefaultTableModel modelo;
        modelo = (DefaultTableModel)InterfacePrincipal.getInstance().getTabla().getModel();
        
        modelo.addRow(vector);
        
        System.out.println("Termina método agregar");
    }

De lo cual llega a imprimir por consola "Termina método agregar", dando a entender que paso por todo lo anterior a esa intrucción dentro del método. Dicho método debería de reflejar la información en la siguiente tabla, pero ahí está el problema, no lo hace.







¿Qué es lo que está pasando?
¿Qué estoy haciendo mal?
¿Qué otra solución puedo ofrecer para agregar un articulo al carrito?



« Última modificación: 25 Mayo 2014, 09:10 am por EAMP14 » En línea

Migugami

Desconectado Desconectado

Mensajes: 22


Systems Analyst


Ver Perfil
Re: Enlazar 3 Clases
« Respuesta #1 en: 24 Mayo 2014, 14:25 pm »

Teóricamente, una nueva instancia es un nuevo objeto. Si tienes dudas sobre esto, puedes hacer la clase  InterfazPrincipal como un singleton, es decir que sólo exista una instancia de dicha clase. El patrón de diseño Singleton se aplica a una clase de la siguiente manera:

Código
  1. public class InterfazPrincipal
  2. {
  3.    private static InterfazPrincipal instance;
  4.  
  5.    // lo hacemos private para evitar que se creen instancias
  6.    private InterfazPrincipal() {
  7.    }
  8.  
  9.    public static InterfazPrincipal getInstance() {
  10.            if (instance == null) instance = new InterfazPrincipal();
  11.            return instance;
  12.    }
  13. }


Entonces, cuando desees utilizar la GUI en otras clases obtienes su instancia por medio del método estático getInstance(). Prueba con ello y si siguen los inconvenientes trata de pegar todo el código para ver posibles fallos.


En línea

EAMP14

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Enlazar 3 Clases
« Respuesta #2 en: 24 Mayo 2014, 21:12 pm »

Teóricamente, una nueva instancia es un nuevo objeto. Si tienes dudas sobre esto, puedes hacer la clase  InterfazPrincipal como un singleton.
Woah, esto no lo sabía, que genial. ¿Cómo se llama el tema relacionado a eso? para buscar mas información.


También de vuelta al problema en si, probé con lo que mencionas y otras combinaciones, pero no se refleja en la tabla, los metodos que utlizé. Cabe mencionar que no hay otra tabla en esa clase por lo que no hay problema en saber cual tabla es.

getModeloTablaCarrito() // Devuelve el modelo de la tabla
getTablaCarrito() // Devuelve la tabla

Los probé dentro de la misma clase, donde se encuentra la tabla y funcionan correctamente, por lo que me lleva a pensar que realmente obtiene la tabla solo que de otro objeto y no del "original". En unos momentos edito el tema y adiciono algunas notas importantes. Gracias por tu tiempo.
En línea

Migugami

Desconectado Desconectado

Mensajes: 22


Systems Analyst


Ver Perfil
Re: Enlazar 3 Clases
« Respuesta #3 en: 25 Mayo 2014, 08:11 am »

Ya te entendí, la tabla está en una GUI y Carrito solo debe guardar datos en esa tabla. No es necesario el patrón Singleton, nada más tienes que pasarle la referencia de la clase InterfazPrincipal a la clase Carrito que guardará la referencia en un objeto InterfazPrincipal. Recuerda que en Java el paso de parámetros es por referencia, así que cualquier cambio que se haga en la referencia, se guardará.

Código
  1. public class Carrito {
  2. InterfazPrincipal gui;
  3.  
  4. public Carrito (InterfazPrincipal gui) {
  5. this.gui = gui;
  6. }
  7.  
  8. public void agregar(String nombre , String precio){
  9.  
  10.        Object[] fila = new Object{"#", nombre , precio}; // importante, siempre debes introducir una fila Object
  11.        DefaultTableModel modelo = (DefaultTableModel)gui.getModeloTablaCarrito();
  12.        modelo.addRow(fila);
  13.    }
  14.  
  15. }

Código
  1. public class InterfazPrincipal extends JFrame {
  2. // le pasamos la referencia de la clase a la clase Carrito
  3. final Carrito CARRITO_DRIVER = new Carrito(this);
  4.  
  5. // otras cosas
  6. }

O puedes hacer uso de reflection:

Código
  1. public class Carrito {
  2. InterfazPrincipal gui = Class.forName("paquete.Clase").getInstance();
  3.  
  4. public Carrito () {
  5. }
  6.  
  7. public void agregar(String nombre , String precio){
  8.  
  9.        Object[] fila = new Object{"#", nombre , precio};
  10.        DefaultTableModel modelo = (DefaultTableModel)gui.getModeloTablaCarrito();
  11.        modelo.addRow(fila);
  12.    }
  13.  
  14. }
« Última modificación: 25 Mayo 2014, 08:21 am por Migugami » En línea

EAMP14

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Enlazar 3 Clases
« Respuesta #4 en: 25 Mayo 2014, 08:34 am »

Ya te entendí, la tabla está en una GUI y Carrito solo debe guardar datos en esa tabla. No es necesario el patrón Singleton, nada más tienes que pasarle la referencia de la clase InterfazPrincipal a la clase Carrito que guardará la referencia en un objeto InterfazPrincipal. Recuerda que en Java el paso de parámetros es por referencia, así que cualquier cambio que se haga en la referencia, se guardará.

Código
  1. public class Carrito {
  2. InterfazPrincipal gui;
  3.  
  4. public Carrito (InterfazPrincipal gui) {
  5. this.gui = gui;
  6. }
  7.  
  8. public void agregar(String nombre , String precio){
  9.  
  10.        Object[] fila = new Object{"#", nombre , precio}; // importante, siempre debes introducir una fila Object
  11.        DefaultTableModel modelo = (DefaultTableModel)gui.getModeloTablaCarrito();
  12.        modelo.addRow(fila);
  13.    }
  14.  
  15. }

Código
  1. public class InterfazPrincipal extends JFrame {
  2. // le pasamos la referencia de la clase a la clase Carrito
  3. final Carrito CARRITO_DRIVER = new Carrito(this);
  4.  
  5. // otras cosas
  6. }

O puedes hacer uso de reflection:

Código
  1. public class Carrito {
  2. InterfazPrincipal gui = Class.forName("paquete.Clase").getInstance();
  3.  
  4. public Carrito () {
  5. }
  6.  
  7. public void agregar(String nombre , String precio){
  8.  
  9.        Object[] fila = new Object{"#", nombre , precio};
  10.        DefaultTableModel modelo = (DefaultTableModel)gui.getModeloTablaCarrito();
  11.        modelo.addRow(fila);
  12.    }
  13.  
  14. }

¡Muchas Gracias!

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Referencias
Programación Visual Basic
Sancho.Mazorka 2 2,480 Último mensaje 1 Enero 2007, 08:35 am
por Sancho.Mazorka
Referencias a objetos
Java
zardanic 2 3,090 Último mensaje 13 Mayo 2008, 21:25 pm
por zardanic
Referencias en PHP
PHP
madpitbull_99 0 2,628 Último mensaje 4 Junio 2011, 00:01 am
por madpitbull_99
Dudas con las referencias
Programación C/C++
Dark Invader 5 2,912 Último mensaje 27 Julio 2011, 13:37 pm
por Dark Invader
Error referencias con las clases
Programación C/C++
niñopixel 0 1,301 Último mensaje 28 Septiembre 2016, 16:45 pm
por niñopixel
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines