You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:33:11