3

さて、私はどこが間違っているのか誰かに教えてもらえないかと思っていました。

AppletViewerとJAppletを保持するGUIと呼ばれるJFrameを使用して、Eclipse内から実行すると正常に実行されるGameと呼ばれる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

私はこれを答えます:より良い解決策は、JPanelsの作成に向けてGUIを調整することだと思います。次に、GUIをアプレットとして実行する場合は、JPanelを作成して、JAppletのcontentPaneに配置するだけです。同様に、JFrameを作成する場合は、JPanelを作成し、それをJFrameのcontentPaneに配置します。

その他の問題:

  • 画像はjarファイルに保持される可能性が高いため、リソースとして取得することを検討してください。
  • JAppletなどのトップレベルウィンドウに直接描画したり、paintメソッドを使用したりしないでください。
  • 代わりに、JPanelのオーバーライドされたpaintComponent(...)メソッドを描画します。これにより、コードでSwingのダブルバッファリングを利用できるようになります。
  • SwingGUIでオーバーライドしないでくださいupdate(...)。これはAWTに対して行われますが、Swingでは避ける必要があります。
  • ペイント方法内で、画像を読み込んだり、CPUを集中的に使用したりしないでください。
  • Swingペインティングのチュートリアルをチェックして、この種のコーディングをどのように行うべきかを確認してください。入門チュートリアルはここにあり、より高度な記事はここにあります
于 2012-06-24T03:44:34.557 に答える
3

注:質問が「なぜこれが起こっているのですか?」だった場合。答えは、JVMがアプレットのコンテキストとスタブを自動的に設定することです。ただし、アプレットがWebページにロードされない限り、これは発生しません。自分でロードする場合は、それらの機能を実装、インスタンス化、およびアタッチする必要があります。

アプレット要素によって通常提供される詳細を取得したら、そうすることはそれほど難しくありません。

(OTOHの最善の戦略は、ゲームをパネルに変換し、フレームに入れて、JWSを使用して起動することです。)

于 2012-06-24T06:59:52.243 に答える