Ошибка с таймером и JFrame - PullRequest
0 голосов
/ 07 июня 2011

Я делаю игру с таймером и 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 ]

2 голосов
/ 07 июня 2011

Метод переопределения - это paintComponent (), а не "paintComponents" (с s).

Вы никогда не должны вызывать метод paintComponent () напрямую.Вместо этого вы вызываете метод repaint () для компонента.

2 голосов
/ 07 июня 2011

Вы вообще не должны рисовать direclty в JFrame, а скорее JPanel или JComponent, который хранится в JFrame. Вы должны переопределить метод paintComponent JPanel, как отмечено выше (не JFrame, так как у него даже нет этого метода), и рисовать там. Другое дело, не используйте java.util.Timer, а скорее javax.swing.Timer, более известный как таймер Swing, поскольку это приложение Swing. Также вы не должны вызывать paint / paintComponent напрямую, а должны иметь поля класса обновления GUI, затем вызывать repaint () на JPanel, на котором вы рисуете, и затем JCM будет (обычно) вызывать paintComponent. Здесь, на этом форуме, есть много примеров анимации Swing, и я предлагаю вам найти эти примеры и учиться у них, так как я думаю, что они могут вам помочь.

Редактировать: черт возьми, вам уже говорили все это в ваших предыдущих темах. Почему мы должны вам помогать, если вы игнорируете наш совет?

2 голосов
/ 07 июня 2011

Вы получаете NPE, потому что передаете null как графику в window.paintComponents(null); А затем вы звоните g.drawImage(j.getImage(),j.getX(), j.getY(), null);, где g равно нулю.

...