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

Vaadin 8中Java确认子窗口失效 点击确认后Excel生成逻辑不执行

问题根因

你的代码逻辑是同步执行的,openConfirmationPanel方法只会把弹窗挂载到当前UI上,不会阻塞当前按钮点击事件的执行线程。你调用完弹窗打开方法后立刻判断isConfirmed的值时,用户还没来得及点击弹窗的确定/取消按钮,isConfirmed还是初始的false,所以你的Excel生成逻辑永远不会触发。

修复方案

改用回调机制处理用户选择结果:给YesNoConfirm类新增回调接口,用户点击弹窗按钮时,通过回调将选择结果回传给调用方,再在回调里执行对应的Excel生成逻辑即可。

第一步:修改自定义YesNoConfirm类

public class YesNoConfirm extends Window{
    // 新增回调接口
    public interface ConfirmCallback {
        void onConfirm(boolean confirmed);
    }

    public void openConfirmationPanel(String confirmationTitle, ConfirmCallback callback) {
        Window subWindow = new Window(confirmationTitle);
        VerticalLayout subContent = new VerticalLayout();
        subContent.setMargin(true);
        subWindow.setContent(subContent);
        
        HorizontalLayout buttonStack = new HorizontalLayout();
        Button okButton = new Button("OK");
        Button cancelButton = new Button("Anuleaza");
        buttonStack.addComponent(okButton);
        buttonStack.addComponent(cancelButton);
        
        subContent.addComponent(new Label("Confirmare"));
        subContent.addComponent(buttonStack);
        
        subWindow.center();
        UI.getCurrent().addWindow(subWindow);
        
        okButton.addClickListener(ClickEvent -> {
            subWindow.close(); // 点击后关闭弹窗
            callback.onConfirm(true);
        });
        
        cancelButton.addClickListener(ClickEvent -> {
            subWindow.close(); // 点击后关闭弹窗
            callback.onConfirm(false);
        });
    }
}

第二步:修改主按钮点击逻辑

把原来的if(panel1.getConfirmationStatus() == true)包裹的Excel生成逻辑,移到回调的onConfirm方法中:

getBtnGenereazaNOTAAUTORIZARE().addClickListener(new Button.ClickListener() {
    public void buttonClick(ClickEvent event) {
        if(log.isDebugEnabled())log.debug("getBtnGenereazaNOTAAUTORIZARE ");
        File xlsFile = new File("/home/misadmin/rapoarte/Nota_Autoriz_Ch_DL_Anexa9a.xlsx");
        SelectBeanStream result = new SelectBeanStream();
        InputStream is;
        YesNoConfirm panel1 = new YesNoConfirm();
        // 传入回调处理选择结果
        panel1.openConfirmationPanel("Confirmare", new YesNoConfirm.ConfirmCallback() {
            @Override
            public void onConfirm(boolean confirmed) {
                if(confirmed) {
                    try {
                        String pattern = "yyyy-MM-dd HH:mm:ss";
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
                        String fisierNume=prj_cod+"_RF_"+NR_Rap+"-NotaAutorizare_"+(simpleDateFormat.format(new Date())).replace(" ", "_").replaceAll(":", "_");
                        if(log.isDebugEnabled())log.debug("getBtnGenereazaNOTAAUTORIZARE ctrlExportXls fisierNume "+fisierNume);
                        result = GrantulLocalServiceUtil.dl_Cheltuieli_NA(xlsFile, fisierNume, prj_cod, String.valueOf(NR_Rap));
                        if(log.isDebugEnabled())log.debug("getBtnGenereazaNOTAAUTORIZARE ctrlExportXls result "+result);
                        is=result.getStream();
                        if(log.isDebugEnabled())log.debug("getBtnGenereazaNOTAAUTORIZARE ctrlExportXls is "+is);
                        if(log.isDebugEnabled())log.debug("getBtnGenereazaNOTAAUTORIZARE ctrlExportXls is.available() "+is.available());
                        byte[] targetByte = new byte[is.available()];
                        is.read(targetByte);
                        
                        showFile(getBtnGenereazaNOTAAUTORIZARE().getUI(), fisierNume, targetByte, "XLSX", getBtnGenereazaNOTAAUTORIZARE());
                        is.close();
                        
                    } catch (IOException e) {
                        e.printStackTrace();
                    }   
                }
            }
        });
    }
});
额外优化说明

原来的实现里点击按钮后弹窗不会自动关闭,修复后的代码在点击确认/取消按钮时会主动关闭弹窗,符合常规交互逻辑。

内容的提问来源于stack exchange,提问作者Cristian Sfetcu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:36:02