Vaadin 文件下载器和复选框,下载所选项目

Vaadin 文件下载器和复选框,下载所选项目,vaadin,vaadin7,Vaadin,Vaadin7,我们已经创建了一个解决方案,其中用户有一个包含文件的表,每个条目都有复选框。他可以选择任意数量,然后单击下载按钮 我们正在使用这样的资源,它应该允许动态下载,这取决于所选的项目 private StreamResource createResource(final IndexedContainer container) { return new StreamResource(new StreamSource() { @Override

我们已经创建了一个解决方案,其中用户有一个包含文件的表,每个条目都有复选框。他可以选择任意数量,然后单击下载按钮

我们正在使用这样的资源,它应该允许动态下载,这取决于所选的项目

private StreamResource createResource(final IndexedContainer container) {
        return new StreamResource(new StreamSource() {
            @Override
            public InputStream getStream() {

                for (Object o : container.getItemIds()) {
                    CheckBox checkbox = (CheckBox) container.getItem(o).getItemProperty(C_CHECK_BOX).getValue();
                    if (checkbox.getValue()) {
                        selectedFiles.add(o);
                    }
                }
                // do some magic to get stream of selected files


            }
        }, "download.zip");
}
问题是,只有第二次和随后的点击按钮才会产生预期的结果

事实证明,FileDownLoader从服务器获取资源,然后发送组件的当前状态。这就是为什么第一次点击会产生过时的结果

你知道如何克服这个问题吗?是否可以强制:首先更新组件,然后下载资源

非常感谢 Pawel不适合您的需要。正如您在文档中看到的:

当用户单击按钮时,应直接开始下载,而无需通过服务器端的单击侦听器,以避免在某些浏览器中触发安全警告

这意味着您无法动态生成由复选框值确定的
download.zip
文件,因为这需要访问服务器

你至少有两个选择。每次用户更改复选框时,创建新的
FileDownloader
并生成新的
Resource
download.zip
。或者,您可以使用以下代码行向按钮添加简单的
ClickListener

getUI().getPage().open(resource, "_blank", false);

相关:

默认情况下,Vaadin中的复选框是非即时的,这意味着在浏览器上选中(或取消选中)复选框时,它不会向服务器发送请求。即时组件也会将排队的非即时事件发送到服务器,但FileDownloader似乎不会导致将非即时复选框值发送到服务器的事件

您需要做的唯一一件事是在创建以下复选框时将复选框设置为立即:

checkBox.setImmediate(true);

还有另一种解决方案可以设置
checkBox.setImmediate(true)。可以在单击之前发送所有组件的当前状态,而不是发送每个复选框更改

此解决方案基于以下答案:

您需要创建文件下载器按钮并将其隐藏:

Button hiddenButton = new Button();    
hiddenButton.setId(HIDDEN_ID);
hiddenButton.addStyleName("InvisibleButton");
StreamResource zipResource = createResource(container);
FileDownloader fd = new FileDownloader(zipResource);
fd.extend(hiddenButton);
将css规则添加到主题中

.InvisibleButton {
    display: none;
}
然后创建另一个按钮,第一次更新状态,然后单击隐藏按钮

Button zipDownload = new Button("Download as ZIP file");
zipDownload.addClickListener(new Button.ClickListener() {
     @Override
     public void buttonClick(Button.ClickEvent event) {    
          Page.getCurrent().getJavaScript()
         .execute(String.format("document.getElementById('%s').click();", HIDDEN_ID));
            }
        });

尝试调用setImmediate(true);当你创建这些复选框时,我认为这不是问题所在。看我的答案。我可能错了,但我给了我最好的猜测。我们需要等待smolarek999来解决这个问题。我已经测试过了,它可以工作了!我也通过复选框上的自定义值更改侦听器解决了这个问题,但您的解决方案更优雅。Thanks@smolarek999是的,向其中添加ValueChangeListener会使组件在最新的Vaadin版本中立即生效。。