JavaFX:点击新窗口按钮向TableView添加数据失败求助
问题分析与解决方案
核心问题
添加失败的本质是操作了错误的控制器实例:
在DashbordController的addtotable方法中,每次调用都会重新加载FXMLDocument.fxml并创建新的FXMLDocumentController对象,你往这个新实例的dataList里添加数据,和当前界面显示的TableView所属的控制器完全无关,所以界面不会更新。
另外还有一个次要问题:FXMLDocumentController的calculation()方法中重新赋值了dataList,覆盖了初始的ObservableList引用,虽然不直接导致添加失败,但会破坏数据绑定的一致性。
修复步骤
1. 传递原控制器实例到弹窗
修改FXMLDocumentController的addRow方法,把当前控制器实例传给弹窗的控制器:
@FXML public void addRow(ActionEvent event) throws IOException{ FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("dashbord.fxml")); Parent root1 = fxmlLoader.load(); // 获取弹窗控制器并传入当前主控制器 DashbordController dashCtrl = fxmlLoader.getController(); dashCtrl.setMainController(this); Stage stage = new Stage(); stage.setScene(new Scene(root1)); stage.show(); }
2. 修改DashbordController接收主控制器
在DashbordController中添加主控制器引用,并直接用它调用添加方法:
public class DashbordController implements Initializable { private FXMLDocumentController mainController; // 新增setter方法 public void setMainController(FXMLDocumentController mainController) { this.mainController = mainController; } // ... 原有成员变量与初始化方法 @FXML private void addtotable(ActionEvent event) { // 调用原控制器的addrows方法 mainController.addrows( id.getText(), name.getText(), address.getText(), description.getText(), quantity.getText(), transiction.getText(), payment.getText() ); // 关闭弹窗 ((Stage) id.getScene().getWindow()).close(); } }
3. 修正dataList的赋值问题(推荐)
在FXMLDocumentController的calculation()方法中,不要重新创建dataList,而是清空后添加初始数据:
private void calculation(){ // ... 原有列创建代码 // 替换原有的dataList = FXCollections.observableArrayList(...) dataList.clear(); dataList.addAll( new Customer("1", "AMIT", "east west", "batman tshirt", "= 1","/NO","NOT COMPLETED",rbutton[0]), new Customer("2", "AMIT", "east west", "batman tshirt", "= 1","/NO","NOT COMPLETED",rbutton[1]), new Customer("3", "AMIT", "east west", "batman tshirt", "= 1","/NO","NOT COMPLETED",rbutton[2]), new Customer("4", "AMIT", "east west", "batman tshirt", "= 1","/NO","NOT COMPLETED",rbutton[3]) ); // ... 原有列绑定、过滤排序代码 }
4. 修复新增行按钮重复的问题
当前addrows方法中固定使用rbutton[4],会导致所有新增行共用同一个Button实例,替换为创建新按钮:
@FXML public void addrows(String id, String name, String address, String description, String quantity, String transiction, String payment) { Button previewBtn = new Button("Preview"); Customer customer = new Customer(id, name, address, description, quantity, transiction, payment, previewBtn); dataList.add(customer); Platform.runLater(() -> { int row = tableview.getItems().size() - 1; tableview.getSelectionModel().select(row); tableview.scrollTo(row); }); }
完成以上修改后,弹窗输入的数据会正确添加到当前界面的TableView中。
内容的提问来源于stack exchange,提问作者Multi Content
相关产品推荐
相关产品推荐

