首页 > 解决方案 > 如何在不破坏按钮的情况下将新的 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 是一个全局变量,设置为我可能不会更改的布局。我知道,不好,但它是一个古老的产品)

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

任何人的线索?

任何帮助表示赞赏

标签: vaadin

解决方案


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

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


推荐阅读