2017-09-21 54 views
0

我遵循Vaadin示例代碼,但是當我這樣做時,我需要第二次點擊才能開始文件下載。下面是我的代碼:Vaadin FileDownload需要點擊兩次以下載按鈕

final StreamResource streamResource = new StreamResource(
     () -> { 
      return new ByteArrayInputStream("hello world".getBytes()); 
     }, document.getName() + ".txt"); 

FileDownloader fileDownloader = new FileDownloader(streamResource); 
fileDownloader.extend(getDownloadButton()); 

有什麼特別的代碼來創建按鈕,但在意見中的要求在這裏它是:

Button downloadButton = new Button("Download"); 
+0

你可以添加在其中創建您的按鈕的代碼? –

+1

我記得前一陣子,在按鈕點擊偵聽器中設置流資源時發生了這種情況。這是你的情況嗎? – Morfic

+0

我也有同樣的錯誤。我想我記得在下載事件之後流正在設置*,這就是爲什麼您需要再次點擊。這可以測試更改您點擊後下載的文件。 – Shirkam

回答

0

雖然我不喜歡這個解決方案很有效。它與下載的工作方式以及瀏覽器的一些限制有關。我相信有更好的解決方案,但現在我模擬了第一次點擊Javascript。如果有人能找到正確的答案,那麼請張貼它,我會改變選定的答案,否則這是我發現的唯一解決方案(發佈在Vaadin論壇)。

streamResource = createStreamResource(); 
downloadButton createDownloadButton(); 
downloadButton.setId("DownloadButtonID"); 

if(fileDownloader == null) 
{ 
    fileDownloader = new FileDownloader(streamResource); 
    fileDownloader.extend(downloadButton); 
    // Javascript click so that it works without a second click 
    Page.getCurrent().getJavaScript().execute(
      "document.getElementById('DownloadButtonID').click();"); 
} else { 
    fileDownloader.setFileDownloadResource(streamResource); 
} 
+0

你試過使用'按鈕#單擊()'而不是使用JS? – Shirkam

0

的解決方案,第二次點擊需要下載的文件是按鈕的監聽器。就像我的情況,我有點擊監聽器的按鈕,其中FileDownloader擴展按鈕。但它應該沒有監聽器,因爲FileDownloader有自己的機制來處理監聽器操作。

在這裏,第一個按鈕點擊被clickListener處理,只有這樣,fileDownloader擴展了下載按鈕,該按鈕包含下載文件的所有功能,並且只有當單擊事件通過FileDownloader時纔會發生此功能。所以下次單擊FileDownloader時會像現在這樣擴展按鈕。

public static Button getDownloadButton(String fileName, String fileAsString, String caption) { 
    // caption 
    Button dwnButton = new Button(caption, VaadinIcons.DOWNLOAD); 
    dwnButton.addClickListener(listener -> { 
     StreamResource resource = createResource(fileName, fileAsString); 
     FileDownloader fileDownloader = new FileDownloader(resource); 
     fileDownloader.extend(dwnButton); 
    }); 
    return dwnButton; 
} 

在這裏,fileDownloader已經擴展了按鈕,它具有所有的流資源。所以在第一次點擊時只下載被調用。

public static Button getDownloadButton(String fileName, String fileAsString, String caption) { 
    // caption 
    Button dwnButton = new Button(caption, VaadinIcons.DOWNLOAD); 
    StreamResource resource = createResource(fileName, fileAsString); 
    FileDownloader fileDownloader = new FileDownloader(resource); 
    fileDownloader.extend(dwnButton); 
    return dwnButton; 

}

相關問題