2017-09-13 12 views
0

JPAの複数のテーブルからデータを取得しています。ここで は最初のエンティティです:別のJPAエンティティからJavaFXテーブルのデータを取得する方法

@Entity 
@Table(name = "source") 
public class Source implements Serializable { 
    @Id 
    @Column(name = "sourceid", nullable = false) 
    private String sourceId; 
    @ManyToOne 
    @JoinTable(name = "flux") 
    private Flux flux; 

    // Other attributes 
    // Constructors, getters and setters 
} 

そしてここでは、最初の1から参照される第2のエンティティは、です:

@Entity 
@Table(name = "flux") 
public class Flux implements Serializable { 
    @EmbeddedId 
    private FluxId fluxId = new FluxId(); 
    @Column(name = "value") 
    private BigDecimal value; 
    @Column(name = "error") 
    private BigDecimal error; 

    // Other attributes 
    // Constructors, getters and setters 
} 

私は、単一のJavaFXの表に、これらのテーブルのデータを表示したいです。どうやってするか?ここに私がしようとしていたが、flux.valueflux.errorの列は常に空です。これを修正するには?

// Source table setup 
    sourceIdColumn.setCellValueFactory(new PropertyValueFactory<>("sourceId")); 
    fluxColumn.setCellValueFactory(new PropertyValueFactory<>("flux.value")); // Value of the flux 
    errorColumn.setCellValueFactory(new PropertyValueFactory<>("flux.error")); // Error of the flux 
    // More columns definition from sources attributes 

答えて

1

にあなたがそれを取り込むことができます

private ObservableList<FluxModel> tableData = FXCollections.observableArrayList(); 

、あなたが持っています「プロパティのプロパティ」をサポートしていない)。

表がTableView<Source>であり、fluxColumnerrorColumnがともにTableColumn<Source, BigDecimal>であると仮定します。あなたがJavaFX properties patternとあなたのエンティティを実装する(とJPA Property Accessを使用する)なら、あなたは代わりにするたびに新しいものを作成するのは、既存のプロパティを取得することができます

fluxColumn.setCellValueFactory(cellData -> 
    new SimpleObjectProperty<>(cellData.getValue().getFlux‌​().getValue())); 
errorColumn.setCellValueFactory(cellData -> 
    new SimpleObjectProperty<>(cellData.getValue().getFlux‌​().getError())); 

を行うことができます。

fluxColumn.setCellValueProperty(cellData -> cellData.getValue().getFlux().valueProperty()); 
errorColumn.setCellValueProperty(cellData -> cellData.getValue().getFlux().errorProperty()); 
0

Iは、例えば、FluxModelのために、モデルクラスを作成することをお勧め:あなたのコントローラクラスで

public class FluxModel { 

private LongProperty id; 
private ObjectProperty<BigDecimal> value; 
private ObjectProperty<BigDecimal> error; 

    public FluxModel(
      Long id, 
      BigDecimal value, 
      BigDecimal error) { 
     this.id = new SimpleLongProperty(id); 
     this.value = new SimpleObjectProperty<>(value); 
     this.error = new SimpleObjectProperty<>(error); 
    } 

    public long getId() { 
     return id.get(); 
    } 

    public LongProperty idProperty() { 
     return id; 
    } 

    public BigDecimal getValue() { 
     return value.get(); 
    } 

    public ObjectProperty<BigDecimal> valueProperty() { 
     return value; 
    } 

    public BigDecimal getError() { 
     return error.get(); 
    } 

    public ObjectProperty<BigDecimal> errorProperty() { 
     return error; 
    } 
} 

:cellValueFactoriesとして、その後

@FXML 
private TableView<FluxModel> table; 
@FXML 
private TableColumn<FluxModel, Long> sourceIdColumn; 
@FXML 
private TableColumn<FluxModel, BigDecimal> fluxColumn; 
@FXML 
private TableColumn<FluxModel, BigDecimal> errorColumn; 

sourceIdColumn.setCellValueFactory(data-> data.getValue().idProperty().asObject()); 
fluxColumn.setCellValueFactory(data -> data.getValue().valueProperty()); 
errorColumn.setCellValueFactory(data -> data.getValue().errorProperty()); 

を追加する必要があるかもしれませんを細胞に導入する。

その後、あなたは、データを格納するためのリストが必要になります。ただ、(代わりにPropertyValueFactoryを使用するのではなく、直接セル値の工場を実装

table.setItems(tableData); 
関連する問題