Kyle_jumpen Kyle_jumpen - 14 days ago 9
Java Question

Javafx 8 : Populating a TableView in initialize method

I'm new to JavaFX 8 and I am trying to feed a TableView with some data in the controller using the initialize method.
I have seen a lot of topic on it, try a lot of stuff but it didn't work for me.
I've seen :



and a lot more but none of the solutions happend to work for me.

Here is my code :
class Employee

public class Employee extends Person{

private SimpleIntegerProperty salary;
private SimpleObjectProperty<Character> droit;

public Employee(){
super();
this.salary = new SimpleIntegerProperty();
this.droit = new SimpleObjectProperty<Character>();
}

public Employee(int id, String firstName, String lastName, String password, char droits, int salary) {
super(id,firstName,lastName,password);
this.salary = new SimpleIntegerProperty(salary);
this.droit = new SimpleObjectProperty<Character>(droits);
}

public Employee(String firstName, String lastName, String password, char droits, int salary) {
super(firstName,lastName,password);
this.salary = new SimpleIntegerProperty(salary);
this.droit = new SimpleObjectProperty<Character>(droits);
}

...

}


class Person

public class Person {

protected SimpleStringProperty firstName;
protected SimpleStringProperty lastName;

public Person(){
this.firstName = new SimpleStringProperty();
this.lastName = new SimpleStringProperty();

}

public Person(String firstName, String lastName){
this.firstName = new SimpleStringProperty(firstName);
this.lastName = new SimpleStringProperty(lastName);
}

public String getFirstName() {
return firstName.get();
}

public void setFirstName(String firstName) {
this.firstName.set(firstName);
}

public StringProperty firstNameProperty(){
return this.firstName;
}

public String getLastName() {
return this.lastName.get();
}

public void setLastName(String lastName) {
this.lastName.set(lastName);
}

public StringProperty lastNameProperty(){
return this.lastName;
}


Here is the FXML that defines the User Interface :

ConsultHR.fxml

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.control.DatePicker?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<VBox fx:id="ConsultHR" maxHeight="600.0" maxWidth="600.0" minHeight="500.0" minWidth="500.0" prefHeight="550.0" prefWidth="550.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.kaf.app.controller.hr.ConsultHRController">
<children>
<HBox maxHeight="450.0" minHeight="450.0" prefHeight="450.0">
<children>
<TableView fx:id="table" prefHeight="426.0" prefWidth="288.0">
<columns>
<TableColumn fx:id="lastNameCol" prefWidth="131.0" text="Nom" />
<TableColumn fx:id="firstNameCol" prefWidth="154.0" text="Prénom" />
</columns>
</TableView>
</HBox>
<ButtonBar prefHeight="40.0" prefWidth="400.0">
<buttons>
<Button mnemonicParsing="false" onAction="#goHRAction" text="Rssources Humaines" />
</buttons>
<VBox.margin>
<Insets right="15.0" />
</VBox.margin>
</ButtonBar>
</children>
</VBox>


And finally Here is the Controller :
** class ConsultHRController **

public class ConsultHRController extends DefaultController implements Initializable{

@FXML
VBox ConsultHR;

@FXML
public TableView<Employee> table;

@FXML
TableColumn<Employee,String> firstNameCol;

@FXML
TableColumn<Employee,String> lastNameCol;

DAO<Employee> dao;

SimpleListProperty<Employee> employees;

@Override
public void initialize(URL location, ResourceBundle resources){
super.initialize();
dao = (DAO<Employee>) dFact.getEmployeeDAO();
try {
employees = dao.findAll();
System.out.println(employees.get());
table =new TableView<Employee>(employees);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Employee, String>("firstName"));
lastNameCol.setCellValueFactory(new PropertyValueFactory<Employee, String>("lastName"));
table.getColumns().setAll(firstNameCol, lastNameCol);
System.out.println(firstNameCol.getCellData(0));
} catch (SQLException e) {
// TODO Mettre une popup erreur base de données
e.printStackTrace();
}

}

public void goHRAction(ActionEvent e) throws IOException{
goSmwhereAction((Stage) ConsultHR.getScene().getWindow(),"/fr/kaf/app/fxml/hr/HumanRessources.fxml");
}

}


As you can see I have a "System.out.println(firstNameCol.getCellData(0));" in the initialize method. It results in giving me that the cell is not empty and it's filled in with the good data but I don't see anything in my UI.

Answer

You replace your TableView in your initialize method.

table =new TableView<Employee>(employees);

You assign the data to the new TableView and leave the one created from the fxml empty.

Instead use the one injected by the FXMLLoader:

@Override
public void initialize(URL location, ResourceBundle resources){
    super.initialize();
    dao = (DAO<Employee>) dFact.getEmployeeDAO();
    try {
        employees = dao.findAll();

        // set data for the table created by the FXMLLoader
        table.setItems(employees);

        // no need to add them to the table since the FXMLLoader is ready doing that
        firstNameCol.setCellValueFactory(new PropertyValueFactory<>("firstName"));
        lastNameCol.setCellValueFactory(new PropertyValueFactory<>("lastName"));
    } catch (SQLException e) {
        // TODO Mettre une popup erreur base de données
        e.printStackTrace();
    }

}