Java-апплет: вызов JavaScript - JSObject.getWindow (this) всегда возвращает null - PullRequest
1 голос
/ 19 июня 2011

Мой 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";
}
}

Мой 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>

Апплет загружается, и когда я нажимаю кнопку, я всегда получаю значение NULL, возвращаемое getDrives (). Почему?

Ответы [ 2 ]

3 голосов
/ 19 июня 2011

Из расплывчатой ​​памяти вызовы для установки JSObject завершатся неудачно, если вызываться из метода init().

Так вот ..

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

.. вероятно должно быть ..

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

Поскольку метод start() может вызываться много раз (например, восстанавливать браузер из свернутого), возможно, стоит использовать чек:

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

Обновление

Я видел это в Чтение / запись значений полей HTML из JAVA . «Мелкий шрифт» внизу страницы отмечает:

Для достижения наилучшего результата никогда не используйте LiveConnect JSObject в методе init () апплета.

1 голос
/ 07 октября 2012

Проверьте эту строку кода:

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

Разве это не должно быть?:

if (js == null) return "NULL";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...