Javafx 8 : Populating a TableView in initialize method

被刻印的时光 ゝ 提交于 2019-11-26 08:57:27

问题


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 :

  • How to populate TableView dynamically with FXML and JavaFX
  • How to populate a TableView that is defined in an fxml file that is designed in JavaFx Scene Builder
  • Javafx PropertyValueFactory not populating Tableview

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.


回答1:


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();
    }

}


来源:https://stackoverflow.com/questions/40817165/javafx-8-populating-a-tableview-in-initialize-method

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!