2017-09-21 2 views
0

Je suis l'exemple de code Vaadin mais quand je le fais, j'ai besoin d'un second clic pour démarrer le téléchargement du fichier. Ci-dessous mon code:Vaadin FileDownload nécessite le bouton être cliqué deux fois pour télécharger

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

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

Il n'y a rien de spécial le code pour créer le bouton, mais comme demandé dans les commentaires ici il est:

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

Pouvez-vous ajouter le code où le bouton est créé? –

+1

Je me souviens que cela m'arrivait il y a un certain temps, lors de la définition de la ressource de flux à l'intérieur du bouton d'écoute de clic. Est-ce votre cas aussi? – Morfic

+0

J'ai aussi eu la même erreur. Je pense que je me souviens que le flux était en train d'être réglé * après * l'événement de téléchargement, c'est pourquoi vous avez besoin d'un second clic. Cela peut être test de changer le fichier que vous téléchargez après un clic. – Shirkam

Répondre

0

Bien que je n'aime pas cette solution, il fonctionne. Cela a à voir avec le fonctionnement du téléchargement et certaines restrictions imposées par le navigateur. Je suis sûr qu'il y a une meilleure solution mais maintenant je simule le premier clic avec Javascript. Si quelqu'un peut trouver la bonne réponse, veuillez la poster et je vais changer la réponse choisie, sinon c'est la seule solution que j'ai trouvée (postée sur les forums 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

Avez-vous essayé d'utiliser 'Button # click()' à la place en utilisant JS? – Shirkam

0

La solution à la deuxième exigence de clic pour télécharger le fichier est l'auditeur du bouton . Comme dans mon cas, j'ai l'écouteur de clic du bouton dans lequel FileDownloader étend le bouton. Mais il devrait être sans écouteur seulement car FileDownloader a son propre mécanisme pour gérer les actions de l'écouteur.

Ici, le premier clic sur le bouton est géré par clickListener et seulement en cela, fileDownloader étend le bouton de téléchargement qui contient toutes les fonctionnalités de téléchargement du fichier et cette fonctionnalité se produit uniquement lorsque l'événement click passe par FileDownloader. donc pour la prochaine fois, cliquez sur FileDownloader comme maintenant son extension du bouton.

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; 
} 

Ici, fileDownloader étend déjà le bouton et dispose de toutes les ressources de flux. Ainsi, au premier clic, seul le téléchargement est appelé.

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; 

}