13

FileDownloaderを作成し、 を使用して拡張を呼び出すのは非常に簡単であることを知っていますButton。しかし、どうすればダウンロードを開始できますButtonか?
現在の私の特定の状況でComboBoxは、ユーザーに送信したいファイルは、入力に基づいて値を変更した後に生成されます。ファイルは、別のクリックを待たずにすぐに送信する必要があります。それは簡単に可能ですか?

ありがとうラファエル

4

2 に答える 2

15

私は自分で解決策を見つけました。実は2つ。最初のものは非推奨のメソッド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は、非推奨とマークする理由として、いくつかのメモリとセキュリティの問題について言及しています


2 番目の例では、リソースを 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);
}
}

注: ユーザーがサーバー上のすべてのファイルを開くことを実際に許可しているわけではありません。デモンストレーション用です。

于 2013-12-05T15:25:10.203 に答える
7

これが私の回避策です。それは私にとって魅力のように機能します。それがあなたを助けることを願っています。

  1. ボタンを作成し、Css で非表示にします (コードではありません: button.setInvisible(false))。

    final Button downloadInvisibleButton = new Button();
    downloadInvisibleButton.setId("DownloadButtonId");
    downloadInvisibleButton.addStyleName("InvisibleButton");
    

    テーマで、次のルールを追加して非表示にしdownloadInvisibleButtonます。

    .InvisibleButton {
        display: none;
    }
    
  2. ユーザーが 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();");
      }
    });
    
于 2015-06-04T11:16:08.680 に答える