vaadin - 如何在不破坏按钮的情况下将新的 BrowserWindowOpener 附加到按钮?
问题描述
在 Vaadin 7 我有工作代码:
private void gridAttachmentsClickItemEventAction(ItemClickEvent event) {
// blablabla some code to get the data from the repository
byte[] data = bibocoAttachmentResponseEntity.getBody().getContent();
StreamResource.StreamSource source = convertByteArrayToStreamResource(data);
String filename = "c:\\droppdf\\"
+"temp"+bibocoAttachmentResponseEntity.getBody().getFileName()+LocalDate.now().toString();
StreamResource resource = new StreamResource(source, filename);
resource.setMIMEType("application/pdf");
resource.getStream().setParameter("Content-Disposition", "attachment; filename=" + filename);
BrowserWindowOpener opener = new BrowserWindowOpener(resource);
opener.extend(btnAttachmentPreview);
}
当我单击网格行时,将从该网格收集数据,并且其上的代码通过调用服务从存储库中获取数据字节 []。
之后,当用户单击 btnAttachmentPreview 时,会打开一个新的浏览器选项卡并显示 pdf(这就是数据字节 [] 中的内容)
这第一次工作正常,但是当我在网格中选择一个新行时,问题是第二次调用没有将侦听器设置为按钮右侧。它在新选项卡中再次显示第一个数据字节 [],而不是当前数据...访问该方法,第二次将正确的数据 [] 加载到数组中,我检查了。
我相信由于代码而附加的 btnAttachmentPreview 上的侦听器
opener.extend(btnAttachmentPreview);
应该首先装箱(清空或归零)。但据我所知,我没有提及它。问题是我不想破坏 btnAttachmentPreview 对象。(btnAttachmentPreview 是一个全局变量,设置为我可能不会更改的布局。我知道,不好,但它是一个古老的产品)
当我关闭浏览器并重新启动并单击另一行时,会显示正确的数据字节 []。
任何人的线索?
任何帮助表示赞赏
解决方案
您可以使用其方法删除扩展remove()
,即opener.remove();
.
如果您无法轻松构建代码以存储对旧开启程序的引用,以便在您想要添加新开启程序时使用它,那么您可以使用btnAttachmentPreview.getExtensions()
获取所有当前扩展的集合,然后您可以从中找到适当的分机(如果有)并调用remove()
它。
推荐阅读
- c# - 如何以编程方式制作与控件关联的 UWP 弹出窗口?
- excel - 复制粘贴不同工作表范围内最新日期的价格
- webrtc - 如何使用 WebRTC 实现 TURN first ICE 连接?
- matlab - Matlab Voicebox代码中不兼容矩阵的来源
- ruby - 使用`bundle gem flob`时,为什么会创建一个与gem同名的目录?
- file-upload - rich:fileUpload 设置初始文件列表
- javascript - 获取和验证复选框和单选按钮的值
- scala - Scala:不可参数化提取器的解决方法
- javascript - Mongoose:按嵌套字段排序
- firebase - 在 Firebase Cloud Functions 中加密数据