计时器和JFrame出错

时间:2011-06-07 09:43:35

标签: java swing timer jframe

我正在制作一个带有计时器和JFrame的游戏(以及许多其他东西,但只有这2个导致问题),并且在运行下面的段之后,我得到了一个奇怪的错误。至少对于那些在此之前从未使用过这些课程的人来说。

开始执行此

private static GameView window;
private static Timer time;
public static void main(String args[])
{
    window = new GameView(800,600);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

    time = new Timer();
    time.schedule( new TimerTask(){
        public void run(){GameState.update(); 
        window.paintComponents(null);}
        },0, 40);

}

称之为:

public void paintComponents (Graphics g)
{

    for(Bullet j : GameState.getEnBullets()){
        g.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    for(Enemy j : GameState.getEnemies()){
        g.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    for(Bullet j : GameState.getPlayBullets()){
        g.drawImage(j.getImage(),j.getX(), j.getY(), null);}
    this.paint(g);
}

这是错误:

Exception in thread "Timer-0" java.lang.NullPointerException
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    at java.awt.Container.paint(Unknown Source)
    at java.awt.Window.paint(Unknown Source)
    at Game.GameView.paintComponents(GameView.java:59)
    at Game.GameController$1.run(GameController.java:39)
    at java.util.TimerThread.mainLoop(Unknown Source)
    at java.util.TimerThread.run(Unknown Source)

我还得到一个空白的JFrame窗口(GameView扩展了JFrame)。

3 个答案:

答案 0 :(得分:2)

您获得NPE是因为您在null中将window.paintComponents(null);作为图形传递然后您正在调用g.drawImage(j.getImage(),j.getX(), j.getY(), null);,其中g为空。

答案 1 :(得分:2)

要覆盖的方法是paintComponent()而不是“paintComponents”(带有s)。

您永远不应该直接调用paintComponent()方法。而是在组件上调用repaint()方法。

答案 2 :(得分:2)

你根本不应该在JFrame中绘制direclty,而应该是由JFrame持有的JPanel或JComponent。您应该如上所述覆盖JPanel的paintComponent方法(不是JFrame,因为它甚至没有这个方法)并在那里绘制。另一件事,不要使用java.util.Timer,而是使用javax.swing.Timer,因为这是一个Swing应用程序,因此更好地称为Swing Timer。此外,您不应该直接调用paint / paintComponent,而是让您的GUI更新类字段然后调用您正在绘制的JPanel上的repaint(),然后paintComponent将(​​通常)由JVM调用。在这个论坛中有很多Swing动画的例子,我建议你搜索这些例子并从中学习,因为我认为他们可以帮助你。

编辑:哎呀,你以前的帖子中已经告诉过你了。如果你忽视我们的建议,我们为什么要帮助你?