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