Applet Java: appeler JavaScript – JSObject.getWindow (this) retourne toujours nul

Mon applet Java

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JApplet; import javax.swing.JButton; import netscape.javascript.JSObject; @SuppressWarnings("serial") public class LocalFileSystem extends JApplet { private JSObject js; private final JButton button; public LocalFileSystem() { setLayout(null); button = new JButton("getDrives()"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { button.setText( getDrives() ); } }); button.setBounds(25, 72, 89, 23); add(button); } public void init() { js = JSObject.getWindow(this); } public String getDrives() { if (js != null) return "NULL"; for (File f: File.listRoots()) js.call("addDrive", new String[] { f.getAbsolutePath() }); return "NOT NULL"; } } 

Mon code HTML:

 <!-- language: lang-html --><html> <head> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> </head> <body> <script type="text/javascript"> function addDrive(s) { alert(s); } </script> <object type="application/x-java-applet;version=1.4.1" width="180" height="180" name="jsap" id="applet"> <param name="archive" value="http://localhost/LocalFileSystemApplet/bin/applet.jar?v=<?php print mt_rand().time(); ?>"> <param name="code" value="LocalFileSystem.class"> <param name="mayscript" value="yes"> <param name="scriptable" value="true"> <param name="name" value="jsapplet"> </object> </body> </html> 

L'applet est en cours de chargement et lorsque je touche le bouton, je reçois toujours NULL retourné par getDrives (). Pourquoi?

À partir d'une mémoire vague, les appels pour établir le JSObject échoueront s'ils sont appelés à partir de la méthode init() .

Donc ça..

 public void init() { js = JSObject.getWindow(this); } 

.. devrait probablement être ..

 public void start() { js = JSObject.getWindow(this); } 

Puisque la méthode start() peut être appelée plusieurs fois (par exemple, la restauration du navigateur minimisé), il pourrait payer pour utiliser une vérification:

 public void start() { if (js==null) { js = JSObject.getWindow(this); } } 

Mettre à jour

Je l'ai vu dans Read / Write HTML field values ​​from JAVA . La «petite impression» au bas de la page indique:

Pour un meilleur résultat, n'utilisez jamais LiveConnect JSObject dans la méthode init () de Applet.

Vérifiez cette ligne de code:

 if (js != null) return "NULL"; 

Ne devrais-tu pas le faire?

 if (js == null) return "NULL";