Java 将JApplet嵌入JFrame
好的,我想知道是否有人能告诉我哪里出了问题 我有一个名为Game的JApplet,如果我使用AppletViewer和一个名为GUI的JFrame在eclipse中运行它,它运行得很好。以下是两者的代码: 另外,我去掉了游戏中的大部分代码,使它变得更小,现在它只是基本的 Game.java:Java 将JApplet嵌入JFrame,java,swing,applet,jframe,japplet,Java,Swing,Applet,Jframe,Japplet,好的,我想知道是否有人能告诉我哪里出了问题 我有一个名为Game的JApplet,如果我使用AppletViewer和一个名为GUI的JFrame在eclipse中运行它,它运行得很好。以下是两者的代码: 另外,我去掉了游戏中的大部分代码,使它变得更小,现在它只是基本的 Game.java: package com.ion.brickdodge; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; i
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)
任何帮助都将不胜感激我将给出一个答案:我认为更好的解决方案是让您的GUI面向创建JPanel。然后,如果希望将GUI作为小程序运行,只需创建JPanel并将其放置在JApplet的contentPane中即可。同样,如果要创建JFrame,则创建JPanel并将其放置在JFrame的contentPane中 其他问题:
- 考虑将图像作为资源,因为它们可能保存在jar文件中李>
- 不要直接在顶级窗口(如JApplet)中绘制,也不要使用绘制方法李>
- 取而代之的是使用JPanel的重写
方法。这将允许您的代码利用Swing的双缓冲paintComponent(…)
- 不要覆盖Swing GUI中的更新(…)。这是为AWT做的,但在Swing时应避免
- 在绘制方法中,不要读入任何图像或执行任何其他cpu密集型操作
- 查看Swing绘画教程,了解应该如何进行这种编码。您可以找到入门教程和更高级的文章
(当然,最好的策略是将游戏转换为一个面板,将其放入一个框架中,然后使用JWS启动。)为什么要这样做?为什么不让您的类创建一个JPanel,然后根据需要将其放入JApplet或JFrame中,将其用作applet或桌面呢?您的NPE可能是由
man1=getImage(getCodeBase(),“res/man1.png”)生成的代码>图像文件是否与小程序本身位于同一目录中?注意。可以使用自由浮动启动小程序。但是你最好在一个面板中编写游戏,并将其放在一个框架中,然后使用JWS启动它。好吧,我仍然有点困惑,游戏是一个小程序,因为它需要在网页中运行,但我需要为这个特定的游戏制作一个独立的应用程序。我想我可以把它改成JApplet,然后把它包含在JFrame中,但这不可能吗?这是可能的,但很尴尬。您仍然需要使用paintComponent(…)
override创建一个JPanel或JComponent来进行绘图。您是否已经阅读了Swing图形教程(我假设没有给出您的代码)。在做这个项目之前,先考虑一下做这件事。卢卡斯:太好了,但还是看看我提供的链接。你不会后悔读了它们,尤其是第二本。是的,我知道它们是很好的教程,这就是我如何学会用java制作游戏的