我是JavaFX8的新手,我正在尝试使用initialize方法在控制器中向TableView提供一些数据。我看到了很多关于它的话题,尝试了很多东西,但是对我来说不起作用。
还有很多,但是没有一种解决方案对我有用。
这是我的代码: 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; }
这是定义用户界面的FXML:
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>
最后是控制器:类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"); } }
如您所见,我有一个“ System.out.println(firstNameCol.getCellData(0));” 在initialize方法中。结果是给我该单元格不为空,并且其中填充了良好的数据,但是我的UI中什么都看不到。
您可以用方法替换您TableView的initialize方法。
TableView
initialize
table =new TableView<Employee>(employees);
您将数据分配给新数据,并将TableView从fxml创建的数据留空。
而是使用由注入的一个FXMLLoader:
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(); } }