Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX, TableView and JPA

I'm new to JavaFX and I'm trying to refactor an old Swing application into JavaFX one.

I'm also using JPA (with EclipseLink implementation) to save/retrieve data.
So I've defined some POJOs annotated.

Here below my annotated POJO:

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 *
 * @author alex
 */
@Entity
@Table(name = "materiale", catalog = "elledia", schema = "")
public class Materiale implements Serializable {
  @Transient
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "id")
  private Long id;

  @Basic(optional = false)
  @Column(name = "colata")
  private String colata;

  @Basic(optional = false)
  @Column(name = "dimensione")
  private String dimensione;

  @Basic(optional = false)
  @Column(name = "specifica")
  private String specifica;

  @Basic(optional = false)
  @Column(name = "unita_misura")
  private String unitaMisura;

  @Column(name = "version")
  private Integer version;

  @ManyToOne (fetch = FetchType.LAZY)
  @JoinColumn (name = "certificato_id")
  private Certificato certificato;

  public Materiale(Long id, String colata, String dimensione, String specifica, String unitaMisura, Certificato certificato) {
    this.id = id;
    this.colata = colata;
    this.dimensione = dimensione;
    this.specifica = specifica;
    this.unitaMisura = unitaMisura;
    this.certificato = certificato;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    Long oldId = this.id;
    this.id = id;
  }

  public String getColata() {
    return colata;
  }

  public void setColata(String colata) {
    String oldColata = this.colata;
    this.colata = colata;
  }

  public String getDimensione() {
    return dimensione;
  }

  public void setDimensione(String dimensione) {
    String oldDimensione = this.dimensione;
    this.dimensione = dimensione;
  }

  public String getSpecifica() {
    return specifica;
  }

  public void setSpecifica(String specifica) {
    String oldSpecifica = this.specifica;
    this.specifica = specifica;
  }

  public String getUnitaMisura() {
    return unitaMisura;
  }

  public void setUnitaMisura(String unitaMisura) {
    String oldUnitaMisura = this.unitaMisura;
    this.unitaMisura = unitaMisura;
  }

  public Integer getVersion() {
    return version;
  }

  public void setVersion(Integer version) {
    Integer oldVersion = this.version;
    this.version = version;
  }

  public Certificato getCertificato() {
    return certificato;
  }

  public void setCertificato(Certificato certificato) {
    Certificato oldCertificato = this.certificato;
    this.certificato = certificato;
  }

  @Override
  public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
  }

  @Override
  public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Materiale)) {
      return false;
    }
    Materiale other = (Materiale) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
      return false;
    }
    return true;
  }

  @Override
  public String toString() {
    return "com.alessandrodonato.elledia.certificati.gui.Materiale[ id=" + id + " ]";
  }

}

I'm having some trouble with the TableViewcontrol:

  • ok, I've read various post about how bind POJO to TableView.
  • ok, I have to define an ObservableList an bind it to TableView to populate and to update it.
  • but to define it I've to use SimpleStringProperty instead of String in my POJO properties and annotations doesn't work with this ...

Any idea?

like image 347
AlexD Avatar asked Nov 13 '22 07:11

AlexD


2 Answers

TiwulFX provides JavaFX custom components specially designed to work with java POJO objects.

like image 173
Salah Eddine Taouririt Avatar answered Dec 10 '22 04:12

Salah Eddine Taouririt


Works for me without changing my POJO.

TableColumn coluna1 = new TableColumn("Nome");
TableColumn coluna2 = new TableColumn("Álbum");
TableColumn coluna3 = new TableColumn("Imagem");
TableColumn coluna4 = new TableColumn("Descrição");
TableColumn coluna5 = new TableColumn("Tags");

coluna1.setCellValueFactory(
    new PropertyValueFactory<>("nome")
);
coluna2.setCellValueFactory(
    new PropertyValueFactory<>("album")
);

...

tabelaItens.getColumns().addAll(coluna1, coluna2, coluna3, coluna4, coluna5);

tabelaItens.setItems(FXCollections.observableArrayList(itens));

POJO:

@Entity
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @ManyToOne
    private Album album;

    @Column(name = "nome")
    private String nome;

    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    @Column(name = "data_criacao")
    private Calendar dataCriacao;

    @Column(name = "data_imagem")
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Calendar dataImagem;

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "imagem")
    private byte[] imagem;

    @Column(name = "tipo_imagem")
    private String tipoImagem;

    @Column(name = "descricao")
    private String descricao;

    @Column(name = "tags")
    private String tags;

    ...
}
like image 33
ceklock Avatar answered Dec 10 '22 04:12

ceklock