如何在不首先破坏按钮的情况下将新的 BrowserWindowOpener 附加到按钮?

How to attach a new BrowserWindowOpener to a button, without destroying the button first?

在 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);
}

当我点击网格行时,数据是从该网格收集的 其后的代码通过调用服务从存储库中获取数据 byte[]。

之后,当用户单击 btnAttachmentPreview 时,将打开一个新的浏览器选项卡 并显示 pdf(这是数据 byte[] 中的内容)

这第一次工作正常,但是当我 select 在网格中添加一个新行时, 问题是第二次调用没有将监听器设置为右侧的按钮。 它在新选项卡中再次显示第一个数据字节[],而不是当前数据... 访问方法,正确的data[]已经第二次加载到数组中了,我检查了。

我相信附加的 btnAttachmentPreview 上的监听器是由于代码

opener.extend(btnAttachmentPreview);

应该首先装箱(清空或清空)。但据我所知,我没有提到它。 问题是我不想破坏 btnAttachmentPreview 对象。 (btnAttachmentPreview 是一个全局变量,设置为我可能不会更改的布局。我知道,不好,但它是一个古老的产品)

当我关闭浏览器并重新启动并单击另一行时,显示正确的数据字节[]。

有人知道吗?

感谢任何帮助

您可以使用其 remove() 方法删除扩展,即 opener.remove();

如果您无法轻松构建代码来存储对旧开启器的引用,以便在您想要添加新开启器时可以使用它,那么您可以使用 btnAttachmentPreview.getExtensions() 来获取所有的集合当前分机,然后您可以从中找到合适的分机(如果有的话)并在其上调用 remove()