JApplet不会在浏览器中启动JComponent,而是在Eclipse中运行

时间:2011-03-27 03:22:16

标签: java eclipse applet jcomponent

我在业余时间用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. 在Windows 7计算机上,Applet加载,我听到了我的游戏音乐,但Applet屏幕本身呈现了一个纯白色的盒子而没有别的。
  3. IE和Firefox都会出现这些问题。

    我一直在浏览谷歌和StackOverFlow一段时间,试图挖掘解决方案,但没有运气。我对Applets有点不熟悉,并且希望能够朝着正确的方向努力。

1 个答案:

答案 0 :(得分:1)

可能是一个原因:Swing不是线程安全的,因此GUI上的所有更改(包括您的setContentPane)都应该出现在AWT事件派发线程中。在这个帖子上没有调用applet的start()方法。

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