3

好的,所以我想知道是否有人可以告诉我哪里出错了。

我有一个名为 Game 的 JApplet,如果我使用 AppletViewer 从 eclipse 中运行它,它运行良好,还有一个名为 GUI 的 JFrame,它包含 JApplet。这是两者的代码:

PS。我从 Game 中删除了大部分代码以使其更小,它现在只是基本的。

游戏.java:

package com.ion.brickdodge;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JApplet;


public class Game extends JApplet implements Runnable{

private static final long serialVersionUID = 1L;
Image man1;
Image man2;
Image cman; 
int WIDTH = 250;
int HEIGHT = 350;
int lives = 3;
int spx = WIDTH / 2;
int score = 0;

Image dbImage;
Graphics dbg;

public void init () {
    setSize  (WIDTH, HEIGHT);
    setFocusable(true);
    setBackground(Color.LIGHT_GRAY);

    man1 = getImage(getCodeBase(), "res/man1.png");
    man2 = getImage(getCodeBase(), "res/man2.png");

    cman = man1;

}

public void start() {
    Thread th = new Thread(this);
    th.start();
}

public void run() {
    Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
    while(true){
        repaint();

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    }   
}

public void paint(Graphics g) {

    g.drawImage(cman, spx, 320, this);
    g.setColor(Color.BLACK);
    g.drawString("Score: " + score, 5, 10);
    g.drawString("Lives: " + lives, 5, 25);

}

public void update(Graphics g){
    if (dbImage == null)
    {
        dbImage = createImage (this.getSize().width, this.getSize().height);
        dbg = dbImage.getGraphics ();
    }

    dbg.setColor (getBackground ());
    dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

    dbg.setColor (getForeground());
    paint (dbg);

    g.drawImage (dbImage, 0, 0, this);
}
    }

这是 GUI.java:

package com.ion.brickdodge;

import java.awt.BorderLayout;

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class GUI {

public static void main(String args[]) {
      JFrame frame = new JFrame("test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(1000, 1000);

      JPanel panel = new JPanel(new BorderLayout());
      frame.add(panel);

      JApplet applet = new Game();
      panel.add(applet, BorderLayout.CENTER);
      applet.init();
      frame.pack();

      frame.setVisible(true);
    }
}

当我运行它时抛出的错误 GUI.java 是......

Exception in thread "main" java.lang.NullPointerException
at java.applet.Applet.getCodeBase(Unknown Source)
at com.ion.brickdodge.Game.init(Game.java:30)
at com.ion.brickdodge.GUI.main(GUI.java:22)

任何帮助将非常感激

4

2 回答 2

3

注意:如果问题是“为什么会这样?” 答案是 JVM 会自动为 applet 设置一个 applet 上下文和存根。但除非将小程序加载到网页中,否则不会发生这种情况。如果您自己加载它,则需要实现、实例化和附加这些设施。

一旦您获得了通常由小程序元素提供的详细信息,这样做并不难。

(OTOH 最好的策略是将游戏转换为面板,将其放入框架中,然后使用 JWS 启动它。)

于 2012-06-24T06:59:52.243 回答
3

我会回答这个问题:我认为更好的解决方案是让你的 GUI 用于创建 JPanel。然后,如果您希望将 GUI 作为 applet 运行,您可以简单地创建 JPanel 并将其放置在 JApplet 的 contentPane 中。同样,如果要创建 JFrame,则创建 JPanel 并将其放置在 JFrame 的 contentPane 中。

其他问题:

  • 考虑将图像作为资源获取,因为它们可能会保存在 jar 文件中。
  • 不要直接在 JApplet 等顶级窗口中绘制,也不要使用paint 方法。
  • paintComponent(...)而是在 JPanel 的重写方法中绘制。这将允许您的代码利用 Swing 的双缓冲。
  • 不要update(...)在 Swing GUI 中覆盖。这是为 AWT 完成的,但对于 Swing 应该避免。
  • 不要在绘画方法中读取任何图像或执行任何其他 CPU 密集型操作。
  • 查看 Swing 绘画教程,了解应该如何进行这种编码。您可以在此处找到介绍性教程,并此处找到更高级的文章
于 2012-06-24T03:44:34.557 回答