使用FileDownloader下载后更新UI

时间:2014-07-31 12:46:52

标签: firefox vaadin

我有一些代码扩展了按钮以提供FileDownloader下载:

private final InputStream stream;
private final Label label;
private final Button button;

//…

StreamResource.StreamSource source = new StreamResource.StreamSource() {
    @Override
    public InputStream getStream() {
        label.setValue("downloaded");
        return stream;
    }
};
FileDownloader downloader = new FileDownloader(new StreamResource(source));
downloader.extend(button);

此代码也想更新UI(将Label设置为"downloaded")。 这适用于某些浏览器(Konqueror和Chromium),但在Firefox(31)中它没有。

FF中的行为很奇怪:首次点击该按钮可以在不更新UI的情况下开始下载。再次单击该按钮会显示仅更新UI(即无需下载)。

我怀疑FF并不喜欢FileDownloader's iframe

  

请注意,下载将以iframe

开始

知道如何在StreamSource.getStream()内实现UI的更新?如果没有,还有更好的想法提供下载更新UI吗?

它是vaadin-7.1.15。

2 个答案:

答案 0 :(得分:0)

也许在clicklistener中更新标签值时会有效吗?

button.addClickListener(new ClickListener() {

    @Override
    public void buttonClick(ClickEvent event) {
        label.setValue("downloaded");
    }
});

我也会尝试将标签设置为immediate = true:

label.setImmediate(true);

答案 1 :(得分:0)

您可以按照建议将ClickListener添加到按钮,或者您需要让UI轮询服务器(甚至更好地使用推送)。 第二次单击按钮将更新UI的原因是,此单击启动客户端请求,服务器将回答UI中的更改。在此之前,您已正确更新了UI - 在服务器端 - 但浏览器不知道这一点。因此,您应该使用UI监听器,如ButtonClickListener。

顺便说一下,我不认为这只是一个火狐问题。