Een JApplet insluiten in een JFrame

Ok, dus ik vroeg me af of iemand me kon vertellen waar ik het mis heb.

Ik heb een JApplet met de naam Game die goed wordt uitgevoerd als ik deze vanuit de eclips uitvoert met de AppletViewer en een JFrame met de naam GUI die de JApplet bevat. Hier is de code voor beide:

PS. ik heb de meeste code uit Game verwijderd om het kleiner te maken, het is nu gewoon basic.

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

En hier is 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);
    }
}

De fout die GUI.java genereert wanneer ik deze uitvoer, is ...

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)

Alle hulp zou zeer op prijs worden gesteld

3
Uw NPE wordt waarschijnlijk gegenereerd door man1 = getImage (getCodeBase (), "res/man1.png");
toegevoegd de auteur Kazekage Gaara, de bron
Waarom probeer je dit te doen? waarom zou u niet gewoon uw klasse een JPanel laten maken en deze vervolgens als een applet of een desktop gebruiken zoals u wenst door deze eenvoudig in een JApplet of een JFrame te plaatsen?
toegevoegd de auteur Hovercraft Full Of Eels, de bron
Notitie. Een applet kan vrij zwevend worden gestart met behulp van JWS . Maar je zou beter af zijn om het spel in een paneel te coderen en het in het begin in een kader te plaatsen, en het vervolgens te lanceren met JWS.
toegevoegd de auteur Andrew Thompson, de bron
Zijn de afbeeldingsbestanden in dezelfde map als de applet zelf?
toegevoegd de auteur fireshadow52, de bron

2 antwoord

Ik zal hier een antwoord op geven: ik denk dat de betere oplossing is om je GUI's in te zetten voor het maken van JPanels. Als u vervolgens de GUI als een applet wilt uitvoeren, kunt u eenvoudig uw JPanel maken en deze in het contentPane van de JApplet plaatsen. Op dezelfde manier als u een JFrame wilt maken, maakt u uw JPanel en plaatst u deze in het contentPane van de JFrame.

Andere problemen:

  • Consider getting your images as resources as they'll likely be held in the jar file.
  • Don't draw directly in a top-level window such as a JApplet, and don't use the paint method.
  • Instead draw in the JPanel's overridden paintComponent(...) method. This will allow your code to take advantage of Swing's double buffering.
  • Don't override update(...) in a Swing GUI. This is done for AWT but should be avoided for Swing.
  • Don't read in any images or do any other cpu-intensive actions within a painting method.
  • Check out the Swing painting tutorials to see how one should be doing this kind of coding. You can find the introductory tutorial here, and a more advanced article here
3
toegevoegd
Het is mogelijk, maar ongemakkelijk. Je moet nog steeds een JPanel of een JComponent maken met een paintComponent (...) negeren om je tekening in te voeren. Heb je de grafische tutorials van Swing doorlopen (ik neem aan dat ik je code niet heb gegeven). Overweeg dit te doen voordat je te ver vooruit gaat in dit project.
toegevoegd de auteur Hovercraft Full Of Eels, de bron
@Lucas: zie bewerken voor koppelingen naar de tutorials.
toegevoegd de auteur Hovercraft Full Of Eels, de bron
@Lucas: geweldig, maar kijk nog steeds naar de links die ik heb verstrekt. Je zult er geen spijt van krijgen ze te lezen, vooral de tweede.
toegevoegd de auteur Hovercraft Full Of Eels, de bron
OK ik ben nog steeds een beetje in de war Het spel is een applet omdat het moet worden uitgevoerd op webpagina's, maar ik moest een zelfstandige applicatie maken voor dit specifieke spel. Ik dacht dat ik het kon veranderen in een JApplet en het gewoon kon opnemen in een JFrame, maar is dit niet mogelijk?
toegevoegd de auteur Lucas_F98, de bron
Proost, ik denk dat het goed is gekomen
toegevoegd de auteur Lucas_F98, de bron
ja ik heb ze zijn goede tutorials dat is hoe ik heb geleerd om games te maken in Java
toegevoegd de auteur Lucas_F98, de bron

Note: If the question were "Why is this happening?" the answer would be that the JVM sets up an applet context and stub for the applet automatically. But that does not happen unless the applet is loaded in a web page. If you are loading it yourself, you need to implement, instantiate & attach those facilities.

Het is niet moeilijk om dat te doen, als je eenmaal de gegevens hebt die normaal door het applet-element worden geleverd.

(OTOH de beste strategie is om het spel naar een paneel te converteren, het in een frame te plaatsen en het met JWS te starten.)

3
toegevoegd