2009-04-29 9 views
4

Sur setVisible (vrai), je l'appelle le code suivant pour démarrer une boîte de dialogue modale:Comment simuler une boîte de dialogue modale depuis une applet?

private synchronized void startModal() { 
    try { 
    if (SwingUtilities.isEventDispatchThread()) { 
     EventQueue theQueue = getToolkit().getSystemEventQueue(); 
     while (isVisible()) { 
     AWTEvent event = theQueue.getNextEvent(); 
     Object source = event.getSource(); 
     if (event instanceof ActiveEvent) { 
      ((ActiveEvent) event).dispatch(); 
     } else if (source instanceof Component) { 
      ((Component) source).dispatchEvent(event); 
     } else if (source instanceof MenuComponent) { 
      ((MenuComponent) source).dispatchEvent(event); 
     } else { 
      System.err.println("Unable to dispatch: " + event); 
     } 
     } 
    } else { 
     while (isVisible()) { 
     wait(); 
     } 
    } 
    } catch (InterruptedException ignored) { } 
} 

Cela fonctionne bien dans la plupart des navigateurs. Cependant, dans Opera et Safari pour Windows, je suis confronté à la grand-exception nasty suivante:

java.security.AccessControlException: access denied (java.awt.AWTPermission accessEventQueue) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkAwtEventQueueAccess(Unknown Source) 
    at java.awt.Toolkit.getSystemEventQueue(Unknown Source) 

est-il une solution pour générer des boîtes de dialogue faux-modal dans ces navigateurs?

Répondre

1

Cette autorisation doit être accordée sauf si vous avez une implémentation étrange (Sun PlugIn l'a accordé depuis 1.2.2, IIRC). De quelles versions parlons-nous?

Ce n'est probablement pas la meilleure boucle de répartition.

Vous devriez probablement appeler isVisible à partir de l'EDT.

Les interfaces modales sont généralement désagréables.

Quel est le problème avec une boîte de dialogue modale?

+1

Son Java 1.6u13 (entre autres). Mais, comme état, c'est dans les navigateurs Opera et Safari sur Windows, qui ont tous deux leur propre plugin Java. – jsight

+0

La boîte de dialogue modale ne fonctionne pas, car ce ne sont pas vraiment des boîtes de dialogue. Ils ont juste besoin de bloquer le code appelant (qui est sur l'EDT) jusqu'à ce que la boîte de dialogue soit fermée. Nous pourrions le réécrire avec une approche différente, mais préférerions rester dans l'approche modale au lieu de réécrire des choses pour deux navigateurs bizarres. – jsight

+0

IIRC, Opera utilise le plugin "Firefox 2", qui devrait se comporter de la même façon. Ils devraient vraiment continuer avec la nouvelle interface de plugin Firefox 3/Chrome. Vous pouvez ouvrir une boîte de dialogue sans décoration hors écran. C'est ce que font les dialogues de sécurité de WebStart et PlugIn (bien que, IIRC, ils laissent la décoration, ce qui n'est pas si brillant). –

1

Si je peux offrir une approche différente qui pourrait fonctionner, au lieu d'intercepter les événements dans le thread d'événement, .

+0

Oui, j'aurais dû le mentionner dans la question originale. Il "fonctionne", mais expose des tonnes de bogues difficiles à contourner dans les commandes de swing lorsqu'il est placé sur un verre. Il ne résout pas entièrement le problème de modalité (il ne se contente pas de masquer des événements, il provoque également le blocage de l'appelant par setVisible (true) jusqu'à ce que la boîte de dialogue soit masquée). – jsight

1

La raison d'un problème avec Opera peut être que Opera a son propre fichier java.policy nommé opera.policy (sous le répertoire Opera_installation_directory \ classes). Cependant, dans mon installation d'Opera, je ne pouvais voir aucune permission qui n'est pas accordée dans Opera mais accordée dans le fichier java.policy par défaut.

+0

Sun PlugIn et WebStart accordent cette autorisation. –

1

Vous n'avez pas besoin de signer votre applet pour que cela fonctionne?

La signature d'un applet

La façon de permettre à une applet de faire toutes ces choses est de signer numériquement. En effet le signataire dit "Cette applet est sûre à utiliser, et si vous me faites confiance, vous pouvez faire confiance à cette applet, car grâce à ma signature, vous pouvez être assuré qu'elle n'a pas été falsifiée depuis que je l'ai signée." On demandera ensuite à l'utilisateur si elle veut faire confiance au signataire (habituellement dans une petite boîte de dialogue), et si c'est le cas, l'applet peut continuer avec tous les privilèges. Si l'approbation est refusée, l'applet continue de s'exécuter dans le bac à sable avec des privilèges limités. La décision de faire confiance à une applet devrait être prise très judicieusement, car une applet de confiance a les mêmes privilèges qu'une application démarrée localement: Elle peut lire et supprimer des fichiers, et transmettre des données sur le réseau.

Une explication plus complète du modèle de sécurité de l'applet peut être trouvée ici. Cela inclut une liste complète des restrictions d'applet.

Pour une introduction à la signature d'applet et des liens vers plus d'informations, lisez ceci et surtout ceci. Internet Explorer (et la machine virtuelle Java MS) sont un peu non standard; lisez ceci pour avoir un aperçu de ce qu'il faut faire.

Si, même après la signature de l'applet, vous obtenez toujours un SecurityException, essayez d'exécuter le code comme privilégié:

AccessController.doPrivileged (new PrivilegedAction() { public Exécuter l'objet() { // exécuter l'opération sensible à la sécurité ici return null; } });

JavaDoc: java.security.AccessController

fichiers Politique

Une autre façon d'accorder une applet capacités supplémentaires est l'utilisation des fichiers de politiques, dont Sun a un article d'introduction, et un autre ici spécifiquement pour les applets. En utilisant des politiques, il est possible de contrôler de façon plus fine quels privilèges accorder une applet. Par exemple, il devient possible d'accorder aux applets l'accès au système de fichiers local, mais pas aux autres capacités qui leur sont refusées. Voici un exemple de cela. L'inconvénient de l'utilisation de fichiers de règles réside dans le fait qu'ils résident sur le système de fichiers local. Les utilisateurs doivent donc apporter des modifications à un fichier qui est normalement hors de leur vue et dont le contenu n'est pas trivial à comprendre.

L'exemple suivant montre comment annuler la plupart des restrictions d'applets. L'une quelconque des autorisations peut être rendue plus spécifique, par ex. FilePermission peut être donné pour seulement les fichiers sélectionnés, et avec un accès en lecture seule. Les javadocs de chaque classe d'autorisation expliquent en détail ce qui est possible. C'est une bonne pratique d'utiliser le réglage le plus restreint possible. RuntimePermission en particulier peut être utilisé pour créer ClassLoaders et SecurityManagers, qui peuvent contourner encore plus de restrictions d'applet.

grant codeBase "http://geosim.cs.vt.edu/geosim/-" { 
    permission java.io.FilePermission "<<ALL FILES>>", "read, write, execute, delete"; 
    permission java.net.SocketPermission "*", "accept, connect, listen, resolve"; 
    permission java.util.PropertyPermission "*", "read, write"; 
    permission java.lang.RuntimePermission "*"; 
    permission java.awt.AWTPermission "showWindowWithoutWarningBanner"; 
}; 

Javadocs

JavaDoc: java.awt.AWTPermission JavaDoc: java.io.FilePermission JavaDoc: java.lang.RuntimePermission JavaDoc: java.net.SocketPermission JavaDoc: java.util. PropertyPermission

Questions connexes