How do I define my table in FXML and then use my JavaFX code to populate it dynamically at runtime?
问题:
回答1:
- Define the TableView in the fxml file. Few things to note:
- the root should have a controller class associated with it.
- the TableView and TableColumn should have fx:id attributes specified.
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.MyController">
<center>
<ScrollPane disable="false" visible="true">
<content>
<TableView fx:id="myTableView" prefHeight="-1.0" prefWidth="-1.0">
<columns>
<TableColumn fx:id="idColumn" prefWidth="100.0" text="Id" />
</columns>
</TableView>
</content>
</ScrollPane>
</center>
</BorderPane>
Define the controller class. Few things to note:
- the variables should be linked with the @FXML tag and a new object of TableView/TableColumn should not be created.
- the variables should be named the same as the corresponding attribute value of fx:id as mentioned in the fxml.
- the controller class should implement javafx.fxml.Initializable and hence should define the method public void initialize(URL location, ResourceBundle resources)
a class Data Model class MyDataModel is used to populate the data.
public class MyController implements Initializable {
@FXML private TableView<MyDataModel> myTableView; @FXML private TableColumn<MyDataModel, String> idColumn; @Override public void initialize(URL location, ResourceBundle resources) { idColumn.setCellValueFactory(new PropertyValueFactory<MyDataModel, String>"idColumn")); myTableView.getItems().setAll(getItemsToAdd()); } private List<MyDataModel> getItemsToAdd(){ // this method would fetch the necessary items from database. }
}
Define the Data Model class. Few things to note:
- the variable should be named as idColumnProperty as the string passed for PropertyValueFactory is "idColumn".
- the variable must be private final SimpleStringProperty as the type mentioned in controller class is String for the column.
the model class must have the methods getIdColumn() and setIdColumn(String id)
public class MyDataModel {
private final SimpleStringProperty idColumnProperty = new SimpleStringProperty(""); public MyDataModel(){ this(""); } public MyDataModel(String id){ setIdColumn(id); } public String getIdColumn(){ idColumnProperty.get(); } public void setIdColumn(String id){ idColumnProperty.set(id); }
}