我的代码有错误的说法:
at javax.swing.JComponent.paintComponent(JComponent.java:783)
at com.game.screen.screen.PaintComponent(screen.java:29)
at com.game.screen.screen.GameScreen(screen.java:39)
at com.game.gamecore.Core.StartGame(Core.java:15)
at com.game.gamecore.Core.main(Core.java:6)
我的代码:com.game.screen
package com.game.screen;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
public class screen extends JPanel implements ActionListener {
/**
*
*/
ActionListener AL = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
};
Timer timer = new Timer(5, AL);
double x = 0, y = 0, velY = 0,velX = 0;
public void PaintComponent(Graphics pixel){
super.paintComponent(pixel);
Graphics2D g2 = (Graphics2D) pixel;
Ellipse2D circle = new Ellipse2D.Double(x,y,40,40);
g2.fill(circle);
timer.start();
}
public void GameScreen(){
JFrame GameScreen = new JFrame("THE GAME");
GameScreen.setSize(600, 600);
PaintComponent(null);
GameScreen.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
com.game.gamecore.core
package com.game.gamecore;
public class Core {
public static void main(String[] args) {
// new Menu();
new Core().StartGame();
}
public void StartGame(){
String GameState = "idle";
if(GameState=="idle"){
GameState="Running";
new com.game.screen.screen().GameScreen();
} else if(GameState=="Running") {
//enter process kill code here
}
}
}
我该如何称呼我的PaintComponent(Grahpics G)代码?
ineedto键入随机的东西,其他事情不会让我发布它...我只会继续打开它,直到它停止给我错误...
问题和一些解决方案:
-
PaintComponent
!=paintComponent
。字符串案件对Java标识符很重要,因此请使用正确的标识符,以下是paintComponent
。 - 您在paintComponent方法覆盖之前不使用
@Override
。如果您这样做了,编译器会指出您的方法不是真正的覆盖物,迫使您更仔细地检查方法签名以了解原因,并且您可能会自己发现案件错误。 - 关于
if(GameState=="idle"){
,请勿使用==
或!=
比较字符串。改用equals(...)
或equalsIgnoreCase(...)
方法。了解==
检查两个对象引用是否相同,而不是您感兴趣的。这就是这里重要的。因此,if ("idle".equals(GameState)) {
或更好的是,将枚举用于游戏状态,因为这将更加万无一失。 - 您仅在您的问题上发布了一个例外的一部分,但忽略了至关重要的开始部分,该部分告诉您确切的例外情况。它是什么?nullpointerexception?
- re,
timer.start();
-您正在从paintComponent方法中调用此功能,您不应该这样做。您无法完全控制何时或何时调用PaintComponent,因此在此方法中永远不应该具有对象状态更改代码。 -
PaintComponent(null);
您是直接调用绘画方法,这是您永远不应该做的事情。相反,如果您想向JVM建议为您进行绘画,请致电repaint()
。这就是您的NullPoInterException的原因(我们现在知道正在发生)。您将传递图形对象的null引用,然后尝试调用其上的方法。不要这样做。