Проблемы с апплетом - PullRequest
       22

Проблемы с апплетом

1 голос
/ 23 августа 2011

Я пытаюсь вставить апплет на свой сайт, но я не могу понять, ради бога, почему это не сработает! У меня есть файл JAR с именем BHSurveyor.jar с моим классом, который расширяет javax.swing.JApplet в bhs.gui.GUIApplet. Теперь я уже пытался встроить его в страницу, и я попробовал все, начиная с

<applet codebase="/dist/" archive="/dist/BHSurveyor.jar" code="bhs.gui.GUIApplet" width="256px" height="256px" />

(в локально открытом HTML-файле на один уровень ниже JAR) до

<applet codebase="file://localhost/C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/" archive="file://localhost/C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/BHSurveyor.jar" code="bhs.gui.GUIApplet.class" width="256px" height="256px" />

и все его перестановки, а затем и некоторые ... но каждый раз я получаю одно и то же красное сообщение об ошибке «Ошибка. Нажмите для подробностей» (которое не дает подробностей). Может кто-нибудь сказать мне, что делать здесь?

Моя настройка


Полный пересмотр моей установки можно посмотреть на http://s.supuhstar.operaunite.com/s/content/test/

Тестирование


Как и предполагалось, я побежал

jar -tvf BHSurveyor.jar
'jar' is not recognized as an internal or external command,
operable program or batch file.

Предполагая, что они имели в виду что-то еще, я попытался

java -jar -tvf BHSurveyor.jar
Unrecognized option: -tvf
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Итак, вы видите, что это не помогает ... Опять же, исходя из предположений, я запустил это и получил, как я надеюсь, ожидаемый результат:

"C:\Program Files\Java\jdk1.7.0\bin\jar" -tvf BHSurveyor.jar
     0 Mon Aug 29 11:56:10 EDT 2011 META-INF/
   228 Mon Aug 29 11:56:08 EDT 2011 META-INF/MANIFEST.MF
     0 Mon Aug 29 11:56:10 EDT 2011 bhs/
     0 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/
  2264 Mon Aug 29 11:56:08 EDT 2011 bhs/AnswerType.class
  1851 Mon Aug 29 11:56:08 EDT 2011 bhs/DefPage.class
  1965 Mon Aug 29 11:56:10 EDT 2011 bhs/DefQuestion.class
  1463 Mon Aug 29 11:56:10 EDT 2011 bhs/DefTitlePage.class
  1338 Mon Aug 29 11:56:10 EDT 2011 bhs/Main.class
   615 Mon Aug 29 11:56:08 EDT 2011 bhs/Page.class
   786 Mon Aug 29 11:56:10 EDT 2011 bhs/Question.class
   402 Mon Aug 29 11:56:10 EDT 2011 bhs/TitlePage.class
  1757 Mon Aug 29 11:56:10 EDT 2011 bhs/Utils$1.class
   766 Mon Aug 29 11:56:10 EDT 2011 bhs/Utils$2.class
  6188 Mon Aug 29 11:56:10 EDT 2011 bhs/Utils.class
  3409 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/GUIApplet.class
  1218 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/GUIJFrame.class
  3549 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/GUIPage.class
   824 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/GUIQuestion$1.class
  8650 Mon Aug 29 11:56:10 EDT 2011 bhs/gui/GUIQuestion.class

Конструктор апплета и init


  public GUIApplet(Page... pgs)// throws UnknownHostException
  {
    System.out.println("new GUIApplet(Page... " + pgs + ")");
//    System.out.println(java.net.InetAddress.getLocalHost().getHostAddress());
    System.out.println("  setting layout...");
    setLayout(new java.awt.GridBagLayout());

    System.out.println("  adding components...");
    addComponents();

    System.out.println("  initializing pages...");
    pages = new ArrayPP<>();

    System.out.println("  installing pages...");
    int i=1;
    for (Page p : pgs)
      if (p != null)
        installPage(p);
    System.out.println("  changing look-and-feel...");
    LookAndFeelChanger.setLookAndFeel(LookAndFeelChanger.NIMBUS);
    System.out.println("  fixing nav buttons...");
    fixNavButtons();
    System.out.println("GUIApplet complete");
  }

  public void init()
  {
    // TODO start asynchronous download of heavy resources
    System.out.println("GUIApplet.init()");
  }

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Вы допустили несколько ошибок.

  1. archive должно быть относительно кодовой базы.Это означает, что если ваш jar находится в папке dist, вы должны сказать: <applet codebase="/dist/" archive="BHSurveyor.jar" или <applet codebase="/" archive="/dist/BHSurveyor.jar" (если ваш jar фактически не находится под /dist/dist/BHSurveyor.jar)
  2. Большинство примеров тегов апплета показывают, что они пишут .class суффикс в значении атрибута кода, поэтому в вашем случае напишите: code = "bhs.gui.GUIApplet.class" (как вы делали во втором примере, где кодовая база и архив кажутся совершенно неправильными.
  3. Хотябольшинство элементов HTML поддерживают объединение при написании ширины и высоты. Я никогда не видел, чтобы это поддерживалось в случае апплетов, поэтому удалите px: width="256" height="256"

Использовать консоль апплета. Его можно запустить изменю вашего браузера. Возможно, вы увидите какое-то исключение, которое поможет вам понять, в чем проблема.

Если все это не помогает, выполните следующие действия.

  1. Проверьте ваш апплет с помощью appletviewer или с помощью вашей IDE. Убедитесь, что он может работать.
  2. Поместите его где-нибудь под веб-сервером и вручную проверьте URL-адрес его JAR-файла. Вы должны иметь возможность загрузитьad jar с помощью браузера (или команды wget).
  3. Если это тоже не работает, перейдите туда: http://download.oracle.com/javase/1.4.2/docs/guide/misc/applet.html, Возьмите тег апплета с этого сайта.Попытайся понять это.Скопируйте / вставьте его в свой HTML и сделайте так, чтобы он работал.Затем замените архив кодовой базы на свой и молитесь:).

Удачи.

2 голосов
/ 23 августа 2011
<applet 
    codebase="/dist/" 
    archive="/dist/BHSurveyor.jar" 
    code="bhs.gui.GUIApplet" 
    width="256px" 
    height="256px" />

Измените это на ..

<applet 
    codebase="dist/" 
    archive="BHSurveyor.jar" 
    code="bhs.gui.GUIApplet" 
    width="256" 
    height="256" >
</applet>

Примечание: по моим подсчетам между этими 2 applet элементами есть 5 отличий.


Кодовая база

<applet 
    codebase="file://localhost/C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/" 
    ..

Некоторое тщательное изучение этого абсолютного пути кодовой базы подтолкнуло меня к дальнейшим комментариям.

Я сомневаюсь, что есть такой путь, как показано.Скопируйте / вставьте его в адресную строку браузера и нажмите ввод (всегда хороший «кислотный тест» для путей на основе файлов).

Получаете ли вы список каталогов?

Я подозреваю, что это должно быть:

file:///C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/

(т.е. без localhost).

Существует также особое значение для начального/ в кодовой базе или аналогичном пути.Это приравнивается к «корню сайта».Это означает, что ваша другая кодовая база /dist/ будет на самом деле указывать на

file:///C:/dist/

Какой результат вы получите для этого пути в браузере?

Кстати, ни один из этих вопросов не является риторическим.Чтобы лучше вам помочь, мне нужны ответы.


Обновление на тестовой странице

Полный набор настроек можно посмотреть по адресу http://s.supuhstar.operaunite.com/s/content/test/

Похоже, что BHSurveyor.jar содержит текст, по крайней мере, возвращает тип содержимого text/html.И консоль очень полезна ..

java.lang.reflect.InvocationTargetException
    at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.RuntimeException: java.lang.InstantiationException: bhs.gui.GUIApplet
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.InstantiationException: bhs.gui.GUIApplet
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    ... 15 more
Exception: java.lang.reflect.InvocationTargetException

Обновление апплета при локальном тестировании

После локальной загрузки Jar (возникает другая ошибка, затем устанавливается JDK 7 висправить это), я наконец-то в состоянии увидеть то, что вы описали.

Сообщение об ошибке. Нажмите для подробностей (без подробностей).

  1. Во-первых, обратите внимание, что вы можете использовать параметры кросс-компиляции для компиляции Java 1.5 (или любой другой предыдущей версии) в JDK версии 7.Полезный совет, чтобы узнать, когда наступит время для развертывания.
  2. Но самое главное ..
    • Есть ли какие-нибудь операторы try / catch в методе applet init()?Есть ли в апплете (не по умолчанию) конструктор?Если так, то тот же вопрос re try / catch.
    • Если он не слишком длинный или слишком закрытый, каков код (копия / вставка) частей init() и конструктора исходного кода апплета?

Моя последняя теория (относительно основной проблемы с загрузкой апплета) состоит в том, что существуют операторы try / catch, которые поглощают или игнорируют исключения.Кроме того, я в недоумении, почему апплет не загружается, но не отображает какой-либо соответствующий вывод в консоли Java.

Кроме того, тот факт, что сервер возвращает неправильный тип содержимогопотому что фляга должна быть исправлена, хотя, похоже, здесь нет основной проблемы.

0 голосов
/ 23 августа 2011

Вы ищете в консоли Java?Например, в IE: Сервис-> Свойства обозревателя-> Дополнительно вы увидите опцию включения консоли.Там вы можете увидеть некоторые полезные сообщения об ошибках.

...