JavaFX如何在TabPane的多个标签页中填充表格?
解决JavaFX TabPane多标签页表格数据填充问题
嘿,我来帮你搞定这个问题!不用给每个标签页单独写控制器,咱们用一个控制器就能搞定所有表格的数据填充,一步步来:
问题分析
你现在的代码只给第一个标签页的表格设置了列的cellValueFactory和数据项,但另外两个标签页里的表格(包括它们的列)根本没被初始化和绑定数据,所以自然不会显示内容。
具体解决方案
1. 给FXML里的所有表格和列设置fx:id
打开你的ScheduleServicePane.fxml,给另外两个标签页里的表格和对应列都设置好唯一的fx:id,比如:
- 第二个表格:
tableView2,对应列serviceName2、servicePrice2、serviceDuration2 - 第三个表格:
tableView3,对应列serviceName3、servicePrice3、serviceDuration3
2. 在控制器中注入所有表格和列
把新增的表格和列用@FXML注解注入到控制器里,和第一个表格保持一致:
@FXML private TableView<Service> tableView; @FXML private TableColumn<Service, String> ServiceName; @FXML private TableColumn<Service, Double> ServicePrice; @FXML private TableColumn<Service, Integer> ServiceDuration; // 注入第二个标签页的表格和列 @FXML private TableView<Service> tableView2; @FXML private TableColumn<Service, String> ServiceName2; @FXML private TableColumn<Service, Double> ServicePrice2; @FXML private TableColumn<Service, Integer> ServiceDuration2; // 注入第三个标签页的表格和列 @FXML private TableView<Service> tableView3; @FXML private TableColumn<Service, String> ServiceName3; @FXML private TableColumn<Service, Double> ServicePrice3; @FXML private TableColumn<Service, Integer> ServiceDuration3; // 你的serviceRepository注入(如果用了依赖注入框架) @Autowired private ServiceRepository serviceRepository;
3. 写一个通用的表格初始化方法
避免重复写列配置的代码,封装一个通用方法来初始化表格的列绑定和数据:
private void initTable(TableView<Service> targetTable, TableColumn<Service, String> nameColumn, TableColumn<Service, Double> priceColumn, TableColumn<Service, Integer> durationColumn) { // 设置列的属性绑定 nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); priceColumn.setCellValueFactory(new PropertyValueFactory<>("price")); durationColumn.setCellValueFactory(new PropertyValueFactory<>("duration")); // 绑定数据列表 targetTable.setItems(getServiceList()); } // 规范方法名(Java规范:方法名首字母小写) private ObservableList<Service> getServiceList() { return FXCollections.observableArrayList(serviceRepository.list()); }
4. 在initialize方法中初始化所有表格
在initialize方法里调用通用方法,把三个表格都初始化好:
@FXML public void initialize(URL url, ResourceBundle rb) { // 初始化第一个标签页的表格 initTable(tableView, ServiceName, ServicePrice, ServiceDuration); // 初始化第二个标签页的表格 initTable(tableView2, ServiceName2, ServicePrice2, ServiceDuration2); // 初始化第三个标签页的表格 initTable(tableView3, ServiceName3, ServicePrice3, ServiceDuration3); }
额外提示
一定要确保FXML里的fx:id和控制器里的变量名完全一致,大小写都不能错,否则FXMLLoader没法成功注入组件,表格就不会显示数据。如果后续每个标签页需要不同的数据,只需要修改getServiceList方法,或者给initTable方法加参数来区分不同的数据来源就行。
内容的提问来源于stack exchange,提问作者Wojciech Ga艂ka
相关产品推荐
相关产品推荐

