FileDownloader
我知道创建 a并使用 a 调用 extend真的很容易Button
。但是如何在没有 的情况下开始下载Button
?
在我现在的具体情况下,我有一个ComboBox
并且我想发送给用户的文件是在根据输入更改其值后生成的。该文件应立即发送,无需等待再次单击。这很容易吗?
谢谢拉斐尔
我自己找到了解决方案。其实两个。第一个使用不推荐使用的方法Page.open()
public class DownloadComponent extends CustomComponent implements ValueChangeListener {
private ComboBox cb = new ComboBox();
public DownloadComponent() {
cb.addValueChangeListener(this);
cb.setNewItemsAllowed(true);
cb.setImmediate(true);
cb.setNullSelectionAllowed(false);
setCompositionRoot(cb);
}
@Override
public void valueChange(ValueChangeEvent event) {
String val = (String) event.getProperty().getValue();
FileResource res = new FileResource(new File(val));
Page.getCurrent().open(res, null, false);
}
}
这里的 javadoc提到了一些内存和安全问题作为将其标记为已弃用的原因
在第二个中,我尝试通过在 DownloadComponent 中注册资源来绕过这个不推荐使用的方法。如果 vaadin 专家评论此解决方案,我会很高兴。
public class DownloadComponent extends CustomComponent implements ValueChangeListener {
private ComboBox cb = new ComboBox();
private static final String MYKEY = "download";
public DownloadComponent() {
cb.addValueChangeListener(this);
cb.setNewItemsAllowed(true);
cb.setImmediate(true);
cb.setNullSelectionAllowed(false);
setCompositionRoot(cb);
}
@Override
public void valueChange(ValueChangeEvent event) {
String val = (String) event.getProperty().getValue();
FileResource res = new FileResource(new File(val));
setResource(MYKEY, res);
ResourceReference rr = ResourceReference.create(res, this, MYKEY);
Page.getCurrent().open(rr.getURL(), null);
}
}
注意:我真的不允许用户打开我在服务器上的所有文件,你也不应该这样做。这只是为了演示。
这是我的解决方法。它对我来说就像一个魅力。希望它会帮助你。
创建一个按钮并通过 Css 隐藏它(不是通过代码:button.setInvisible(false))
final Button downloadInvisibleButton = new Button();
downloadInvisibleButton.setId("DownloadButtonId");
downloadInvisibleButton.addStyleName("InvisibleButton");
在您的主题中,添加此规则以隐藏downloadInvisibleButton
:
.InvisibleButton {
display: none;
}
当用户点击 menuItem: 时,扩展fileDownloader
至,然后通过 JavaScriptdownloadInvisibleButton
模拟点击。downloadInvisibleButton
menuBar.addItem("Download", new MenuBar.Command() {
@Override
public void menuSelected(MenuBar.MenuItem selectedItem) {
FileDownloader fileDownloader = new FileDownloader(...);
fileDownloader.extend(downloadInvisibleButton);
//Simulate the click on downloadInvisibleButton by JavaScript
Page.getCurrent().getJavaScript()
.execute("document.getElementById('DownloadButtonId').click();");
}
});