【问题标题】:Applet troubles小程序问题
【发布时间】:2011-11-01 15:47:41
【问题描述】:

我正在尝试在我的网站中嵌入一个小程序,但看在上帝的份上,我无法弄清楚为什么这不起作用!我有一个名为BHSurveyor.jar 的JAR 文件,我的类在bhs.gui.GUIApplet 中扩展了javax.swing.JApplet。现在,我已经尝试将它嵌入到一个页面中,并且我已经尝试了所有来自

<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

Applet 构造函数和初始化


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

【问题讨论】:

  • 版主说明 此问题下的评论已被清除,因为它们已退化为噪音。请保持 cmets 具有建设性。
  • 不是我期望的输出,但那是进步,我还有另一个理论要追求。我会尽快回复你(ish)。
  • VM 不会调用该构造函数,因为它接受参数。 init() 方法为空。这是小程序中不会出现组件的一个原因。为什么单个构造函数会抛出HeadlessException?声明一些不应该在小程序中发生的事情似乎有点过分(或者至少,我不知道它是如何发生的)。在整个构造函数中散布一些System.out.println() 方法并将一个放在init() 中,这样我们就可以跟踪它在做什么(调用了哪些方法/构造函数)以及哪些代码行成功完成。

标签: java html applet embed


【解决方案1】:
<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/" 
    ..

对该代码库绝对路径的仔细检查促使我进一步制作 cmets。

我怀疑是否存在如图所示的任何此类路径。将其复制/粘贴到浏览器地址栏中并按回车键(对于基于文件的路径始终是一个很好的“酸性测试”)。

你得到目录列表了吗?

我怀疑应该是:

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

(即没有localhost)。

代码库或类似路径中的初始/ 也有特殊意义。它等同于“网站的根”。这意味着您的/dist/ 的其他代码库实际上 指向

file:///C:/dist/

你在浏览器中得到那个路径的结果是什么?

顺便说一句 - 这些问题都不是修辞。为了最好地帮助你,我需要答案。


测试页面更新

可以在http://s.supuhstar.operaunite.com/s/content/test/查看我的设置的完整再现

似乎BHSurveyor.jar 包含文本,至少它是returning a content-type of 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. 首先,请注意,您可以使用交叉编译选项在版本 7 JDK 中编译 Java 1.5(或任何以前的版本)。了解何时需要部署的便捷提示。
  2. 但最重要的是..
    • 小程序init() 方法中是否有任何try/catch 语句?小程序是否有(非默认)构造函数?如果是这样,同样的问题重试/抓住。
    • 如果不是太长或太私有,init() 的代码(复制/粘贴)和小程序源的构造函数部分是什么?

我的最新理论(关于小程序加载的主要问题)是有try/catch 语句正在吞噬或忽略异常。除此之外,我不知道为什么小程序无法加载,但在 Java 控制台中没有显示任何相关输出。

顺便说一句,应该修复服务器为 Jar 返回错误内容类型的事实,尽管这似乎不是这里的根本问题。

【讨论】:

  • 当我将file:///C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/ 复制粘贴到我的浏览器中时,它会将我重定向到file://localhost/C:/Users/Supuhstar/Documents/NetBeansProjects/BHSurveyor/dist/...不过,我假设这只是 Opera。
  • 我已经把它放在我的网站上并把它改成&lt;applet codebase="/s/content/test/" archive="http://s.supuhstar.operaunite.com/s/content/test/dist/BHSurveyor.jar" code="bhs.gui.GUIApplet" width="256" height="256"&gt;&lt;/applet&gt;,但它仍然不起作用!如果您想查看我的代码和设置,请查看我的最新编辑
  • 好吧,所以我在我的 Java 控制台中没有得到任何内容......不知道那里发生了什么。无论如何,这些都不是来自我的代码,那么我该如何解决呢?
  • 等等..我注意到这里有一些东西...我一直在用 UTF-8 字符集编译它。我不应该吗?
  • 有没有办法告诉网页/浏览器我使用的是 UTF-8 字符集?
【解决方案2】:

你犯了几个错误。

  1. archive 必须与代码库相关。这意味着如果您的 jar 在 dist 文件夹下,您应该说:&lt;applet codebase="/dist/" archive="BHSurveyor.jar"&lt;applet codebase="/" archive="/dist/BHSurveyor.jar"(除非您的 jar 实际上在 /dist/dist/BHSurveyor.jar 下)
  2. 大多数小程序标记示例显示它们在 code 属性的值中写入 .class 后缀,因此在您的情况下写入:code="bhs.gui.GUIApplet.class"(就像您在代码库和存档的第二个示例中所做的那样似乎完全错了。
  3. 虽然大多数 HTML 元素在写入宽度和高度时都支持联合,但我从未见过小程序支持联合,所以删除 px: width="256" height="256"

使用 Applet 控制台。它可以从您的浏览器菜单启动。可能您会在那里看到某种异常,这将帮助您了解问题所在。

如果所有这些都没有帮助,请执行以下操作。

  1. 使用appletviewer 或使用您的IDE 检查您的小程序。确保它能够运行。
  2. 将其放在 Web 服务器下的某个位置并手动检查其 JAR 文件的 URL。您应该能够使用浏览器(或 wget 命令)下载 jar。
  3. 如果这也不起作用,请访问:http://download.oracle.com/javase/1.4.2/docs/guide/misc/applet.html,从该站点获取小程序标签。试着理解它。将其复制/粘贴到您的 HTML 并使其正常工作。然后将代码库存档替换为您的并祈祷:)。

祝你好运。

【讨论】:

  • 我把applet标签换成了&lt;applet codebase="/dist/" archive="BHSurveyor.jar" code="bhs.gui.GUIApplet.class" width="256" height="256"&gt;Enable Java!&lt;/applet&gt;,还是老样子:
  • 回复。您在第一部分的第 2 点。 code 属性应该是完全限定的类名。在末尾添加“.class”是可以接受的,但不正确。
  • 谢谢,@Andrew,我上次使用小程序是 10 多年前,所以我可能不记得了。 .class 是我在我发现的许多示例中看​​到的。
  • @Supuhstar Andrew 的建议对您有帮助吗?你有没有尝试我的其他建议(appletviewer 等)
  • 不幸的是,Java 教程中的许多 Sun/Oracle 自己的示例和其他示例代码都是这样做的(错误地将 .class 扩展名添加到 FQN)。我将其视为教育人们的个人圣战——尤其是当人们为小程序问题提供帮助时。顺便说一句 - 注意到 1.5 在线文档中缺少链接的“1.4”性质(还添加了.class)。检查 Java 7 文档中的 Applet Deployment - 而不是要查看的 .class。可以继续,但评论不多了..
【解决方案3】:

您在查看 Java 控制台吗?例如在 IE 中:工具->Internet 选项->高级,您将看到启用控制台的选项。您可能会在那里看到一些有用的错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多