我有一些代码扩展了按钮以提供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。
答案 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。
顺便说一下,我不认为这只是一个火狐问题。