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
相关产品推荐
相关产品推荐

