JavaFX Mehrere Klassen in ein TableView

weissnix

Mitglied
Hi,
Ich versuche mich gerade zum Lernen an einem kleinen "Projekt" wo ich einige Daten aus einer DB in eine JavaFX TableView einfügen möchte...Soweit, so (mehr oder weniger) gut...

Mein Model sieht (stark verkürzt) so aus:

public class SparePart implements Serializable {
private Long id;
private String sparePartNumber;
private String specification;

@OneToOne(fetch=FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH})
@JoinColumn(name="id", insertable=false, updatable=false)
private SparePartStock sparePartStock;
...

public class SparePartStock implements Serializable {
@Id
@OneToOne
@JoinColumn(name="sparePart_id")
private SparePart sparePart;
private String storageLocation;
private int stockAmount;
private int minStockAmount;
....

In der Tabelle möchte ich jetzt sparePartNumber, specification, storageLocation und stockAmount zeigen....

Jetzt habe ich aber das Problem, dass ich ja nur eine Klasse in die Tabelle einfügen kann und die Felder aus SparePartStock dann leer bleiben. Habt Ihr vielleicht einen Tip, wie ich auch die Daten aus der anderen Klasse dazubekomme???

Meine Tabellenspalten sehen so aus:

TableColumn<SparePart, String> colSparePartNumber = new TableColumn<SparePart, String>("Ersatzteilnummer");
colSparePartNumber.setMinWidth(300);
colSparePartNumber.setCellValueFactory(new PropertyValueFactory<SparePart, String>("sparePartNumber"));

Danke im Voraus

Gruß
 
Warum nutzt du dann nicht einfach "SparePartStock" als Basis? Das enthält doch "SparePart". Eventuell musst du dann etwas mehr Arbeit in die CellValueFactory (und evtl. auch CellFactory) stecken, aber ansonsten sehe ich gerade keinen Grund es nicht zu verwenden (speziell da SparePartStock und SparePart ein 1:1-Beziehung haben).
 
Hmm...aber wo ist dann der Unterschied? Ob ich jetzt Sparepart als Basis hab und dazu dann SparePartStock ...oder umgedreht (oder hab ich jetzt ein Denkfehler?)
Mit CellValueFactory werd ich mich mal noch etwas genauer befassen müssen, bis jetzt bin ich noch eher an der Oberfläche mit JavaFX.

Danke schonmal
 
Da du es nicht in Code-Blöcken eingebettet hast, habe ich übersehen, dass du die Referenz auf beiden Seiten hast. In dem Fall vergiss es.
Dann ist es einfacher, die TableColumn auf TableColumn<SparePart, SparePart> zu ändern und dann so zu initialisieren:
Java:
tc.setCellValueFactory(param -> new SimpleObjectProperty<SparePart>(param.getValue()));
bzw für den Inhalt etwa so hier (ohne Garantier auf Korrektheit 😉)
Java:
tc.setCellFactory(param -> new CustomCell());

    private static class CustomCell<SparePart> extends TableCell<SparePart, SparePart> {
         
        public CustomCell() {
            // bla bla
        }
      
        @Override
        protected void updateItem(SparePart item, boolean empty) {
          
            super.updateItem(item, empty);
          
            if (empty || item == null) {
                textProperty().unbind();
                setText("");
                setGraphic(null);
                return;
              
            }
           setText(item.getSparePartStock().getStorageLocation());
           // am Besten irgendwie generischer schreiben (Konstruktor-Parameter),
           // um die Klasse nicht für jede Spalten neu zu schreiben...
        }
    }

So etwa.
 
hmm..hab mir das jetzt mal genau angeschaut...und stelle fest, dass ich wohl noch etwas weiter lesen muß...Ich verstehe nämlich GAR NIX davon... Ich werde dann wohl erst ein paar kleinere Brötchen backen 😉.

Danke
 
..SO, hat mir doch keine Ruhe gelassen (und der Kater lag auf meinem Schoß, also konnt ich nicht aufstehen) und ich hab noch etwas rumprobiert auch wenn es jetzt mehr "rumfrickeln" ohne Sinn und Verstand war...
ich mußte dein "setText....." so wie unten ändern, jetzt gehts.
Wie ich das allerdings "generischer" hinbekommen soll weiß ich noch nicht wirklich, aber das ist jetzt erstmal nicht sooo wichtig, ich brauch das für 3 oder 4 Zellen, da kann ichs auch so lösen und mich dann später genauer damit befassen.

Code:
    private static class CustomCell<SparePart> extends TableCell<SparePart, SparePart> {
        public CustomCell(){
        }
       
        @Override
        protected void updateItem(SparePart item, boolean empty){
            super.updateItem(item,  empty);

            if (empty || item == null) {
                textProperty().unbind();
                setText("");
                setGraphic(null);
                return;
           }
           setText(((de.Techmanagement.model.SparePart) item).getSparePartStock().getStorageLocation());
        }
    }

Vielen Dank bis hier hin ;-)

PS: jetzt hab ich erst gefunden wo ich die Code-Tags finde 😉
 

Zurück
Oben