Foro de elhacker.net

Programación => Java => Mensaje iniciado por: mariaelhacker en 8 Marzo 2019, 12:17 pm



Título: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: mariaelhacker en 8 Marzo 2019, 12:17 pm
Hola, buen día.

Tengo una clase padre Aparato y 2 clases hijos: ventilador y Aire, el problema surge cuando agrego algún aparato a la habitación y no refresca el JTablet, no se que debo estar haciendo mal???

Mostrar de esta forma los datos por cada habitacion:
idAparato aparato
1                Luz
2                Ventilador
3                Aire

Adjunto el código de ambas clases.

INICIO CLASE APARATO
@Entity
@Inheritance
@DiscriminatorColumn(name = "descripcion", discriminatorType = STRING)
@DiscriminatorValue("Luz")
@Table(name = "aparato")

public class Aparato  implements Serializable{
  @Id
  @SequenceGenerator(name="sec_idAparato", initialValue=1, allocationSize=1)
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sec_idAparato")
  @Column(name = "idAparato") 
  private Integer idAparato;

  private char tipoSalida='A';
 
  //@Column(name = "descripcion", nullable = true, unique = false)
  private String descripcion;

  @ManyToOne
  @JoinColumn(name = "nroHabitacion")
  private Habitacion unaHabitacion;

    public Aparato(Habitacion unaHabitacion) {
        this.idAparato = idAparato;
        this.unaHabitacion = unaHabitacion;
    }
  public Aparato () { };
 
    public Integer getIdAparato() {
        return idAparato;
    }
    public void setIdAparato(Integer idAparato) {
        this.idAparato = idAparato;
    }
    public char getTipoSalida() {
        return tipoSalida;
    }

    public void setTipoSalida(char tipoSalida) {
        this.tipoSalida = tipoSalida;
    }
    public Habitacion getUnaHabitacion() {
        return unaHabitacion;
    }
    public void setUnaHabitacion(Habitacion unaHabitacion) {
        this.unaHabitacion = unaHabitacion;
    }

    public String getDescripcion() {
        return descripcion;
    }
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    @Override
    public String toString() {
        return idAparato + "-" + descripcion;
    }
   
    public boolean isIdAparato(int nro){
         boolean retorno = false;
         if( this.getIdAparato() == nro){
             retorno = true;   
        }
        return retorno;
    }
}
----FIN CLASE APARATO

---INICIO CLASE VENTILADOR
@Entity
@DiscriminatorValue("Ventilador")
public class Ventilador extends Aparato implements Serializable{

  @Column(name = "velocidad", nullable = true, unique = false)
  private Integer velocidad=0;

   public Ventilador (Habitacion unaHabitacion) {
      super(unaHabitacion);
    };
   
  public Ventilador (Integer velocidad, Habitacion unaHabitacion) {
      super(unaHabitacion);
      this.velocidad = velocidad;
 };

  public Ventilador () { };
 
      public Integer getVelocidad() {
        return velocidad;
    }
    public void setVelocidad(Integer velocidad) {
        this.velocidad = velocidad;
    }
    @Override
    public boolean isIdAparato(int nro) {
        return super.isIdAparato(nro);
    }
    @Override
    public void setUnaHabitacion(Habitacion unaHabitacion) {
        super.setUnaHabitacion(unaHabitacion);
    }
    @Override
    public Habitacion getUnaHabitacion() {
        return super.getUnaHabitacion();
    }
    @Override
    public void setTipoSalida(char tipoSalida) {
        super.setTipoSalida(tipoSalida);
    }
    @Override
    public char getTipoSalida() {
        return super.getTipoSalida();
    }
    @Override
    public void setIdAparato(Integer idAparato) {
        super.setIdAparato(idAparato);
    }
    @Override
    public Integer getIdAparato() {
        return super.getIdAparato();
    }
    @Override
    public void setDescripcion(String descripcion) {
        super.setDescripcion(descripcion);
    }
    @Override
    public String getDescripcion() {
        return super.getDescripcion();
    }
    @Override
    public String toString() {
        return super.toString() + velocidad;
    }
 
}
---------FIN CLASE VENTILADOR

----------INICIO CLASE Aire
@Entity
@DiscriminatorValue("Aire")
public class Aire extends Aparato implements Serializable{

  @Column(name = "temperatura", nullable = true, unique = false)
  private Integer temperatura=0;
   
  @Column(name = "ciclo", nullable = true, unique = false)
  private char ciclo='F';
   public Aire () { };

   public Aire(Habitacion unaHabitacion) {
      super(unaHabitacion);
   }
    @Override
    public boolean isIdAparato(int nro) {
        return super.isIdAparato(nro);
    }
    @Override
    public void setUnaHabitacion(Habitacion unaHabitacion) {
        super.setUnaHabitacion(unaHabitacion);
    }
    @Override
    public Habitacion getUnaHabitacion() {
        return super.getUnaHabitacion();
    }
    @Override
    public void setTipoSalida(char tipoSalida) {
        super.setTipoSalida(tipoSalida);
    }
    @Override
    public char getTipoSalida() {
        return super.getTipoSalida();
    }
    @Override
    public void setIdAparato(Integer idAparato) {
        super.setIdAparato(idAparato);
    }
    @Override
    public Integer getIdAparato() {
        return super.getIdAparato();
    }
    @Override
    public void setDescripcion(String descripcion) {
        super.setDescripcion(descripcion);
    }
    @Override
    public String getDescripcion() {
        return super.getDescripcion();
    }
    public Integer getTemperatura () {
        return temperatura;
    }
   public void setTemperatura(Integer temperatura) {
        this.temperatura = temperatura;
    }
    public char getCiclo() {
        return ciclo;
    }
    public void setCiclo(char ciclo) {
        this.ciclo = ciclo;
    }
    @Override
    public String toString() {
        return super.toString()+ciclo+temperatura;
    }
}

-------FIN AIRE ACONDICIOANDO

-----------CLASE HABITACION
@Entity
@Table(name = "habitacion")
public class Habitacion  implements Serializable{

  @Id
  @SequenceGenerator(name="sec_nroHabitacion", initialValue=1, allocationSize=1)
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sec_nroHabitacion")
  @Column(name = "nroHabitacion")
  private Integer nroHabitacion;
 
  @Column(name = "nombreHabitacion", nullable = false, unique = false)
  private String nombreHabitacion;
 
 
  @ManyToOne
  @JoinColumn(name = "nroPiso")
  private Piso unPiso;
 
  @OneToMany(mappedBy = "unaHabitacion")
  private List<Aparato> aparatos;
   
  @OneToMany(mappedBy = "unaHabitacion")
  private List<Ventilador> ventiladores;
 
  @OneToMany(mappedBy = "unaHabitacion")
  private List<Aire> aires;

 
  public Habitacion (String nombreHabitacion, Piso unPiso)
  {
      this.nombreHabitacion = nombreHabitacion;
      this.unPiso = unPiso;
     
      this.aparatos = new ArrayList<Aparato>();
      this.ventiladores = new ArrayList<Ventilador>();
      this.aires = new ArrayList<Aire>();
  }

  public Habitacion () { };
 
  public Integer getNroHabitacion()
  {
        return nroHabitacion;
  }

    public void setNroHabitacion(Integer nroHabitacion) {
        this.nroHabitacion = nroHabitacion;
    }

    public String getNombreHabitacion() {
        return nombreHabitacion;
    }

    public void setNombreHabitacion(String nombreHabitacion) {
        this.nombreHabitacion = nombreHabitacion;
    }

    public Piso getUnPiso() {
        return unPiso;
    }

    public void setUnPiso(Piso unPiso) {
        this.unPiso = unPiso;
    }

    @Override
    public String toString() {
        return nombreHabitacion;
    }

    public List<Aparato> getAparatos() {
        return aparatos;
    }

    public void setAparatos(List<Aparato> aparatos) {
        this.aparatos = aparatos;
    }

    public List<Ventilador> getVentiladores() {
        return ventiladores;
    }

    public void setVentiladores(List<Ventilador> ventiladores) {
        this.ventiladores = ventiladores;
    }

    public List<Aire> getAires() {
        return aires;
    }

    public void setAires(List<Aire> aires) {
        this.aires = aires;
    }

  public void agregarAparato()throws ErrorException
  {
        Aparato a = new Aparato(this);
        //sino tengo agrego una nueva         
        this.getAparatos().add(a);
        casa.getPersistencia().insertar(a);
  }

  public void agregarVentilador()throws ErrorException
  {
        Ventilador v = new Ventilador(this);
        this.getVentiladores().add(v);
        casa.getPersistencia().insertar(v);

  }

  public void agregarAire()throws ErrorException
  {
        Aire aa = new Aire(this);
        this.getAires().add(aa);
        casa.getPersistencia().insertar(aa);
  }
}
------------------------------------------------------------------------

--------------------------------BOTON GUARDAR
try{
                Habitacion unaHabitacion;
                if (ComboBoxHabitaciones.getItemCount() > 0) {
                    unaHabitacion = (Habitacion) ComboBoxHabitaciones.getSelectedItem();     
                   
                    if(RBLuz.isSelected() == true) {
                       
                        unaHabitacion.agregarAparato();
                    }
                    if(RBVentilador.isSelected() == true) {
                       
                        unaHabitacion.agregarVentilador();
                    }
                    if(RBAire.isSelected() == true) {
                       
                        unaHabitacion.agregarAire();
                    }
                    JOptionPane.showMessageDialog(rootPane, "Se a guardado de manera exitosa.");
                    casa.getPersistencia().refrescar(casa);
                    mostrarAparatos((Habitacion)ComboBoxHabitaciones.getSelectedItem());
                }else{
                    JOptionPane.showMessageDialog(this, "Debe seleccionar una Habitación.");
                    this.ComboBoxHabitaciones.requestFocus();
                }
               
            } catch (Exception e) {
                JOptionPane.showMessageDialog(rootPane, "Se dectecto un problema.!!!!!!!!!!");
            }
--------------------------------------------------------
MOSTRAR APaRATOS--------------------------------------------------

private void mostrarAparatos(Habitacion unaHabitacion){
        this.auxUnaHabitacion=unaHabitacion;
        try {
            MyTableModel tabla = new MyTableModel();
            tabla.isCellEditable(0, 0);
            tabla.setColumnCount(0);
            tabla.addColumn("ID Aparato");
            tabla.addColumn("Aparato");

        this.auxUnaHabitacion=unaHabitacion;
        Iterator <Aparato> listAparato = this.auxUnaHabitacion.getAparatos().iterator();
        Aparato inte;
       
        while(listAparato.hasNext()){
            String nombre="";
            inte = listAparato.next();
           
            if(inte instanceof Ventilador){
                Ventilador v =(Ventilador) inte;
                nombre= v.getDescripcion();
            }else if(inte instanceof Aire)
            {
                Aire aa =(Aire) inte;
                nombre=aa.getDescripcion();
            }
///CUANDO GURADO EL PRIMER APRATO LUZ ME DA ERROR EN ESTA LINEA
            if(inte.getDescripcion().equals("Luz")){
                nombre=inte.getDescripcion();
            }
            tabla.addRow(new Object[]{
               inte.getIdAparato(),nombre
            });
         }

         this.tableAparatos.setModel(tabla);
         tableAparatos.setLayout(null);
           
        } catch (SecurityException e) {
        } catch (HeadlessException e) {
        }             
    }


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: spcruzaley en 8 Marzo 2019, 19:43 pm
Que tal mariaelhacker

Antes de todo, me parece que la jerarquia que estas creando deberia ser diferente, ya que la clase Aire no es un Aparato, por lo cual no tendria que ser hija de Aparato, mas bien deberia ser una interfaz.

Por otra parte, las validaciones que haces en el metodo "mostrarAparatos" (Los if's con instance of) para asignar la "Descripcion" estarian de mas, ya que se pierde el concepto de polimorfismo, deberia solo bastar con que hagas:

Código:
inte.getDescripcion()

Por ultimo, sobre la linea que comentas que te esta dando el error, yo pensaria que primero deberias ver si esta linea te esta regresando algo

Código:
mostrarAparatos((Habitacion)ComboBoxHabitaciones.getSelectedItem());

No mire todo el codigo a detalle, pero espero que mis comentarios puedan ayudarte con algo.


Saludos.


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: mariaelhacker en 9 Marzo 2019, 02:16 am
Hola spcruzaley.

De todos modos corrigiendo estos conceptos, igual no funciona.

private void mostrarAparatos(Habitacion unaHabitacion){
        this.auxUnaHabitacion=unaHabitacion;
        try {
            MyTableModel tabla = new MyTableModel();
            tabla.isCellEditable(0, 0);
            tabla.setColumnCount(0);
            tabla.addColumn("ID Aparato");
            tabla.addColumn("Aparato");

        Iterator <Aparato> listAparato = this.auxUnaHabitacion.getAparatos().iterator();
        Aparato inte;
       
        while(listAparato.hasNext()){
            String nombre="";
            inte = listAparato.next();
           
           System.out.println("idaparato..." + inte.getIdAparato());
            System.out.println("descripcion..." + inte.getDescripcion());

            tabla.addRow(new Object[]{
               inte.getIdAparato(),inte.getDescripcion();
            });
         }

         this.tableAparatos.setModel(tabla);
            tableAparatos.setLayout(null);
           
        } catch (SecurityException e) {
        } catch (HeadlessException e) {
        }             
    }


De esta forma solo devuelve estos datos si agrego aparato
agregue 3 Aparato y agregue 2 ventilador y 3 aire
idaparato...14
descripcion...null
idaparato...15
descripcion...null
idaparato...16
descripcion...null

si agrego ventilador o aire no retorna ningún dato.


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: spcruzaley en 9 Marzo 2019, 22:13 pm
Hola mariaelhacker

Por lo que veo en la salida, el problema no es tanto con los fragmentos de codigo que colocaste, mas bien el problema esta en esta linea: this.auxUnaHabitacion.getAparatos() Al parecer ese metodo o antes de ese metodo no se esta guardando de manera correcta la descripcion.

Te sugiero debuguear tu codigo, si no tienes manera de debuiguearlo, pon logs para ver en donde se pierde el valor (Si es que se pierde) o bien, en donde deberia estar guardando y porque no lo hace, ya que te esta mandando un valor nulo.


Saludos.


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: mariaelhacker en 11 Marzo 2019, 15:01 pm
Hola
Si me eh dado cuenta que mi problema pasa por ahi.
El tema es la  Class Aparato lo definí en la persistencia una única tabla por familia (herencia)
 Po lo que este tipo de herencia crea una ÚNICA tabla por la familia de subclases y superclases creando una columna por cada atributo de cada clase y otra columna para definir de que entidad proviene y este atributo es "descripcion".
Por eso no le estoy mandando ese dato descripcion en el mensaje, ya que me parecia redundante pasarle dos veces, entonces pensaba recuperar esa descripcion que guarda en la persistencia.
Si ves en las declaraciones de las clases se puede obesrvar eso.

Ahora veo que no se si es posible.
Tendría que definir otro campo entonces, o pasarle en el mensaje.


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: spcruzaley en 11 Marzo 2019, 20:03 pm
Que tal mariaelhacker

Ya veo, buscando un poco por ahi y en la docu, me he encontrado que puedes hacer algunas cosas para obtener el valor, vi algunos, pero me parece que este seria el mas apropiado, intenta agregando este metodo en tu clase Aparato y despues solo obten el valor del metodo.

Código
  1. @Transient
  2. public String getDescripcion(){
  3.    DiscriminatorValue value = this.getClass().getAnnotation( DiscriminatorValue.class );
  4.    return val == null ? null : val.value();
  5. }
  6.  

PREGUNTA: Si se persiste la descripcion en tu DB ?


Saludos.


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: mariaelhacker en 12 Marzo 2019, 13:16 pm
Hola spcruzaley.

Si persiste bien el campo descripcion en la BD.

Te paso nuevamente como queda la clase aparatos:


@Entity
@Inheritance
@DiscriminatorColumn(name = "descripcion", discriminatorType = STRING)
@DiscriminatorValue("Luz")
@Table(name = "aparato")
public class Aparato  implements Serializable{
  @Id
  @SequenceGenerator(name="sec_idAparato", initialValue=1, allocationSize=1)
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sec_idAparato")
  @Column(name = "idAparato")  
  private Integer idAparato;
  
  @Column(name = "tipoSalida", nullable = true, unique = false)
  private char tipoSalida='A';

  @ManyToOne
  @JoinColumn(name = "nroHabitacion")
  private Habitacion unaHabitacion;

    public Aparato(Habitacion unaHabitacion) {
        this.idAparato = idAparato;
        this.unaHabitacion = unaHabitacion;
    }
  
  
  public Aparato () { };
  
    public Integer getIdAparato() {
        return idAparato;
    }

    public void setIdAparato(Integer idAparato) {
        this.idAparato = idAparato;
    }

    public char getTipoSalida() {
        return tipoSalida;
    }

    public void setTipoSalida(char tipoSalida) {
        this.tipoSalida = tipoSalida;
    }

    public Habitacion getUnaHabitacion() {
        return unaHabitacion;
    }

    public void setUnaHabitacion(Habitacion unaHabitacion) {
        this.unaHabitacion = unaHabitacion;
    }

@Transient
    public String getDescripcion(){
        DiscriminatorValue value = this.getClass().getAnnotation(DiscriminatorValue.class);
        return value == null ? null : value.value();
    }

    @Override
    public String toString() {
        return idAparato + "-" + this.getDescripcion();
    }

}


No muestra en el jtable cuando agrego Ventilador y Aire, cuando agrego Luz, si muestra.
Todos los datos persisten en la BD.

Si salgo de la ejecucion y vuelve a Ejecutar el proyecto ahi me muestra los 3 datos agregado.


asi queda el metodo mostrarAparatos

  private void mostrarAparatos(Habitacion unaHabitacion){
        this.auxUnaHabitacion=unaHabitacion;
        try {
            MyTableModel tabla = new MyTableModel();
            tabla.isCellEditable(0, 0);
            tabla.setColumnCount(0);
            
            tabla.addColumn("ID Aparato");
          
            tabla.addColumn("Aparato");

        this.auxUnaHabitacion=unaHabitacion;
        Iterator <Aparato> listAparato = this.auxUnaHabitacion.getAparatos().iterator();
        Aparato inte;
        
        while(listAparato.hasNext()){
            inte = listAparato.next();
           System.out.println("veeeeer..." + inte.getIdAparato()+" .. "+inte.getDescripcion());
            tabla.addRow(new Object[]{
               inte.getIdAparato(),inte.getDescripcion()
            });
         }

         this.tableAparatos.setModel(tabla);
            tableAparatos.setLayout(null);
            
        } catch (SecurityException e) {
        } catch (HeadlessException e) {
        }            
    }

Me eh dado cuenta que aca esta mi proble
this.auxUnaHabitacion=unaHabitacion;
        Iterator <Aparato> listAparato = this.auxUnaHabitacion.getAparatos().iterator();
        Aparato inte;
        
        while(listAparato.hasNext()){
            inte = listAparato.next();
           System.out.println("veeeeer..." + inte.getIdAparato()+" .. "+inte.getDescripcion());
            tabla.addRow(new Object[]{
               inte.getIdAparato(),inte.getDescripcion()
            });

No esta ingresando cuando agrego alguno de sus hijos


Agradezco muchísimo tu ayuda!


Título: Re: Problema con mostrar datos en JTable con Iterator clase Padre y 2 clase hijos
Publicado por: spcruzaley en 13 Marzo 2019, 17:26 pm
Que tal mariaelhacker

Hay te mande un MP, creo que el problema que hay puede ser algo trivial, sin embargo necesito verlo con mas detalle, sobre todo en la parte donde me dices que esta fallando.


Saludos.
SPCruzaley