TableColumn Bindings Frage

r4w

Mitglied
Hallo,

es geht nochmal um meine Übungs-Anwendung "Ausleihe".
Die Klasse Ausleihe hat die Eigenschaften geraeteID, mitarbeiterID, start- und Enddatum.
Diese Daten gebe ich in einem TableView aus. Nun möchte ich in der TableColumn nicht die mitarbeiterID ausgeben sondern den Namen (aus dem mitarbeiter-Objekt mit der passenden ID).

Irgendwie bastel ich schon ein paar Tage dran rum aber bekomme es nicht hin.
Bildschirmfoto 2017-02-13 um 10.50.32.png
 
Hatte bis jetzt keine Zeit, sorry 😉

Der Code zum Binden der TableColumns sieht so aus:

Java:
    @FXML private TableColumn<Loan, String> TC_LOANHISTORY_Start;
    @FXML private TableColumn<Loan, String> TC_LOANHISTORY_End;
    @FXML private TableColumn<Loan, Number> TC_LOANHISTORY_Employee;

Java:
    TC_LOANHISTORY_Start.setCellValueFactory(cellData -> cellData.getValue().startProperty());
    TC_LOANHISTORY_End.setCellValueFactory(cellData -> cellData.getValue().endProperty());
    TC_LOANHISTORY_Employee.setCellValueFactory(cellData -> cellData.getValue().empIdProperty());

Jetzt würde ich gerne in der Spalte "Mitarbeiter" (s. Bild oben) nicht nur die Mitarbeiter ID (empID), sondern den Namen des Mitarbeiters darstellen.
 
Wie sieht denn dein Mitarbeiter-Model aus?
Da gibt es doch sicherlich einen Getter für die Name-Property, oder?
Dann müsstest du einfach nur .setCellValueFactory(cellData -> cellData.getValue().getNameProperty()); ersetzen.

Edit:
Vergiss es man sollte erst lesen und dann schreiben 😀
Wo/wie speicherst du denn die Datensätze?

Gruß Robert 🙂
 
Klar, es gibt getter für die Property und die Strings der jeweiligen Eigenschaften, wie es in JavaFX gängig ist.

Hier die Models gekürzt dargestellt:

Ausleihe Model
+id
+empID (MitarbeiterID)
+devID (GeräteID)
+start
+end

Mitarbeiter Model
+id
+ name
etc..

Geräte Model
+id
+name
etc..

Ich verstehe nur nicht wie ich die MitarbeiterID aus dem Ausleihe-Model weiterreiche innerhalb der Methode:
Java:
.setCellValueFactory();
 
Momentan hab ich nur Beispieldaten. Werde, wenn alles läuft die Daten in SQL speichern.

Die Objekte Mitarbeiter, Geräte und Ausleihen sind jeweils in Listen gespeichert:
Java:
    private ObservableList<Employee> employeeList = FXCollections.observableArrayList();
    private ObservableList<Device> deviceList = FXCollections.observableArrayList();
    private ObservableList<Loan> loansList = FXCollections.observableArrayList();

Innerhalb von .setCellValueFactory(); hab ich schon einiges versucht, aber ohne Erfolg..
hätte gern sowas wie:
Java:
.setCellValueFactory(cellData -> cellData.getValue().getMitarbeiterNameById(ausleihe.getEmpId());

Danke & Gruß
r4w
 
Dann schreib dir doch so eine Methode 🙂

Vom Grundsatz her musst du nur alle Mitarbeiter in einer Liste speichern, die Liste durchlaufen, die IDs vergleichen und das entsprechende Object zurück geben lassen.
Von diesem Object aus rufst du dann getNameProperty() auf.

Java:
public Employee getEmplyeeById(int id)
{
     for(...)
        if(...)
           return ...
      // du kannst es natürlich auch über Java8 und Streams lösen.
     // Weiß aber nicht in wie weit du dich schon damit auskennst :)
}

setCellValueFactory(cellData -> new SimpleIntProperty( getEmployeeByName( cellData.getValue().getID() ) ) );

Gruß Robert
 
Wow, danke 😉

So klappt's nun!

Java:
TC_LOANHISTORY_Employee.setCellValueFactory(cellData -> new SimpleStringProperty(getEmployeeNameById(cellData.getValue().getId())));

    private String getEmployeeNameById (int id) {
    String name = null;
    for (Employee e : main.getEmployeeList()) {
        if (e.getId().equals(id)) {
        name = e.getFirstName() + " " + e.getLastName();
        }
    }
    return name;
    }
 

Zurück
Oben