Vaadin 如何在不破坏按钮的情况下,将新的BrowserWindowOpener附加到按钮上?

Vaadin 如何在不破坏按钮的情况下,将新的BrowserWindowOpener附加到按钮上?,vaadin,Vaadin,在Vaadin 7上,我有工作代码: private void gridAttachmentsClickItemEventAction(ItemClickEvent event) { // blablabla some code to get the data from the repository byte[] data = bibocoAttachmentResponseEntity.getBody().getContent(); StreamResource.Strea

在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()


如果您无法轻松地构造代码以存储对旧打开程序的引用,以便在添加新打开程序时可以使用它,则可以使用
btnatachmentpreview.getExtensions()
获取所有当前扩展的集合,然后从中找到适当的扩展(如果有)并调用
remove()
在上面。

嘿,谢谢。我现在删除了所有的扩展,然后再添加一个新的扩展。