【问题标题】:JApplet will not launch JComponent in browsers, works in EclipseJApplet 不会在浏览器中启动 JComponent,在 Eclipse 中工作
【发布时间】:2011-03-27 03:22:16
【问题描述】:

我在业余时间用 Java 编写了一个游戏原型。这个游戏只是为了我的教育目的。我通过网络上的 JNLP 启动文件以及通过 JFrame 在我的主机上使其正常工作。

我的主要目的是通过使用 JApplet 使这个原型可以在网络浏览器中播放。我编写了一个名为 AppletPlayer.java 的类。这个类的目的本质上是作为我的游戏主类的启动器。 AppletPlayer.java 文件大致如下:

public class AppletPlayer extends JApplet {
private Game myGame_; // This is my game's main class
private boolean started_ = false;

public void init() {}

public void start() {

    if (!started_) {
        started_ = true;
        myGame_ = new Game();
        this.setContentPane(myGame_);
        myGame_.start() // I set focusable, and enabled to 'true' in the Game's start method
        // My Game class has no init method. Just a start method that spawns a new thread, that the game runs in
    }
}

现在,Game 类本身扩展了 JComponent,并实现了 Runnable、KeyListener 和 FocusListener。如果我通过 Eclipse 启动 AppletPlayer,它的 Applet Viewer 就像一个魅力。但是,当我部署到网络时,我看到了两件事:

  1. 在 Windows XP 机器上,Applet 加载时停留在主标题屏幕上,永远不会获得焦点,因此永远不会注册任何类型的用户输入。
  2. 在加载 Applet 的 Windows 7 机器上,我听到了我的游戏音乐,但 Applet 屏幕本身呈现纯白框,没有其他内容。

IE 和 Firefox 都会出现这些问题。

我一直在仔细研究 Google 和 StackOverFlow,试图找出解决方案,但没有任何运气。我对小程序有点不熟悉,希望能朝着正确的方向轻推。

【问题讨论】:

  • 看看 Java 控制台 - 它可能会提供一些有用的输出。

标签: java eclipse applet jcomponent


【解决方案1】:

原因可能是:Swing 不是线程安全的,因此 GUI 上的所有更改(包括您的 setContentPane)都应该发生在 AWT 事件调度线程中。小程序的start() 方法不在此线程上调用。

将所有与 GUI 相关的方法调用包装在 EventQueue.invokeLater(...) 调用中(或 invokeAndWait,如果您需要一些结果,SwingUtilities 也有这些方法,如果您愿意的话)并查看是否有一些变化。

【讨论】:

  • 我决定将链接页面巧妙地绑定到我的 JNLP 文件。但是,非常感谢您的回答,并让我对调度程序线程进行了很多研究和学习。
猜你喜欢
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2011-08-17
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多