2012-02-28 1 views
3

Je travaille sur une applet d'aide pour gérer les transferts de fichiers volumineux. Nous avons actuellement une applet qui gère la transaction complète, en sélectionnant le dossier contenant les fichiers, en les transférant et en rendant compte du succès et de l'échec de l'opération, mais c'est très insatisfaisant à plusieurs égards. Alors maintenant, nous voulons juste une aide très subtile des applets pour permettre à l'utilisateur de trouver un dossier sur leur machine locale et de gérer le transfert. Nous aimerions autant que possible de la rétroaction et de l'interaction de l'utilisateur pour utiliser les contrôles Web. Donc, comme vous pouvez l'imaginer, cela nécessite une utilisation assez étendue du pont entre les applets et Javascript dans le navigateur. Pour la plupart, c'est assez simple, mais j'ai trouvé un cas de bord bizarre. J'ai une méthode qui ouvre une boîte de dialogue JFileChooser et regarde le contenu de ce dossier et le rapporte. J'ai ceci fonctionnant quand je crée un JButton dans la méthode start() et l'utilise pour faire apparaître le JFileChooser. Mais j'ai mis tout le code pour JFileChooser dans une méthode appelée showFolderSelect() afin que je puisse aussi essayer d'ouvrir le JFileChooser à partir de Javascript. Donc, cet appel à partir de l'applet fonctionne:JFileChooser provoque AccessControlException lorsqu'il est appelé par JS, fonctionne lorsqu'il est appelé par l'intermédiaire de l'applet

public void actionPerformed(ActionEvent event) { 
    if ("browse".equals(event.getActionCommand())) { 
     showFolderSelect(); 
    } 
} 

Mais cet appel de Javascript ne fait pas:

function selectFolder() { 
    var infoApplet = document.getElementById('infoApplet'); 
    infoApplet.showFolderSelect(); 
} 

L'appel Javascript me reçoit le message suivant dans la console Opera:

[5 October, 2003 6:26:56 AM] JavaScript - http://localhost:8080/applet-webapp/ 
Event thread: click 
Uncaught exception: Error: java.security.AccessControlException: access denied (java.util.PropertyPermission user.home read) 
Error thrown at line 20, column 12 in selectFolder() in http://localhost:8080/applet-webapp/: 
    infoApplet.showFolderSelect(); 
called from line 1, column 0 in <anonymous function>(event) in http://localhost:8080/applet-webapp/: 
    selectFolder(); 

Des idées sur la façon dont je peux obtenir ce travail à partir de Javascript? Ou est-ce que je vais juste devoir utiliser le JButton créé dans la méthode start() de l'applet?

Veuillez noter que je ne peux pas m'attendre à ce que les utilisateurs puissent se déplacer avec des configurations java.policy ou quelque chose comme ça. Le seul signe de la sécurité et du contrôle d'accès que nous pouvons nous attendre est que l'applet (s) est (sont) signé numériquement.

Merci pour toute aide ou aperçu sur ce problème.

+0

Voir [cette réponse] (http://stackoverflow.com/a/7842706/418556) re. 'AccessController' /' doPrivileged() '. –

Répondre

0

Je pense que cela illustre ce que Java peut faire et ce que JavaScript ne peut pas faire. Il semble que JavaScript ne soit pas autorisé à appeler des méthodes permettant l'accès au système client. Peut-être que l'accès JavaScript au code Java est limité à ce qui serait autorisé par une applet non signée.

Je ne peux imaginer aucun moyen de contourner cela si c'est juste une limitation dans le pont Java-JavaScript. Et pour moi, ça ressemble à ça.

Si vous n'êtes pas satisfait de l'expérience utilisateur globale de l'applet, pensez à la déplacer vers JavaFX au lieu d'une simple interface de navigateur avec JavaScript.

Consultez la Java FX Ensemble gallery pour obtenir la liste des composants de l'interface utilisateur que vous pouvez utiliser.

0

Sur la plupart des navigateurs Web modernes, les applications JS peuvent uniquement ouvrir des boîtes de dialogue Fichier en réponse à une action de l'utilisateur. Ainsi, vous pouvez créer une boîte de dialogue Ouvrir un fichier à partir d'un gestionnaire onclick (y compris, apparemment, un gestionnaire dans une applet Java), mais pas par exemple. un gestionnaire de chargement.

Ainsi, vous devrez peut-être créer un bouton ou <a href="#"/> pour que l'utilisateur clique dessus, puis appeler le showFolderSelect() à l'intérieur de ce gestionnaire d'événements.

Questions connexes