0
import java.awt.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Images extends JFrame {
    public static void main(String[] args) {
    DisplayMode dm = new DisplayMode(800,600,32, DisplayMode.REFRESH_RATE_UNKNOWN);
    Images I = new Images();
    I.run(dm);
}

private Screen s;
private Image bg;
private Image pic;
private boolean nLoaded;
Animation a;

    public void run(DisplayMode dm)
    {

        nLoaded = false;
         s = new Screen();
        try{

                s.Setfullscreen(dm, this);
                LoadPics();
                MovieLoop();
                try{
                Thread.sleep(50000);    
                }catch(Exception ex){}
        }finally{
            s.restoreScreen();
        }

    }

    public void MovieLoop(){
        long startingtime = System.currentTimeMillis();
        long cumTime = startingtime;

        while(cumTime-startingtime < 5000)
        {
            long timepassed = System.currentTimeMillis() - cumTime;
            cumTime += timepassed;

            a.update(timepassed);

            Graphics g = s.getFullScreenWindow().getGraphics();
            draw(g);
            g.dispose();

            try{
            Thread.sleep(20);
            }catch(Exception ex){}

        }
    }

    public void draw(Graphics g)
    {
        g.drawImage(bg, 0,0, null);
        g.drawImage(a.getImage(),0,0,null); }


    //Create Load Pictures
    public void LoadPics()
    {
        bg = new ImageIcon("C:\\Gamepics\\BackgroundImage.jpg").getImage();
        pic = new ImageIcon("C:\\Gamepics\\SmileyIcon3.png").getImage();
        nLoaded = true;
        repaint();


    }


    public void paint(Graphics g){
        if(g instanceof Graphics2D){
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        }

        if(nLoaded)
        {
            g.drawImage(bg, 0, 0, null);
            g.drawImage(pic, 300,300, null);
        }
    }  
}

私が間違ったことを理解していないので、できる限りすべてを見落としています。単純なアニメーションを練習しているだけで、3 つのヌル ポインター例外が発生し続けます。私は最善を尽くして調査しましたが、どうやらJavaのNullPointerExceptionsはnull配列のサイズを取得しようとすることに関係していますか? コンパイラは私のリストを問題としてマークしていないので、少し混乱しています。どんな助けでも大歓迎です。エラーはすべてコメントアウトされています。それらは3つあり、Imagesクラスにあります

エラー:

Exception in thread "main" java.lang.NullPointerException
at Images.MovieLoop(Images.java:45)
at Images.run(Images.java:26)
at Images.main(Images.java:8)

アニメーションクラス

import java.awt.Image;
import java.util.*;
public class Animation {

private ArrayList scenes;
private int sceneindex;
private long movietime;
private long totaltime;
//CONSTRUCTOR
public Animation(){
    scenes = new ArrayList();
    totaltime =0;
    start();

}
//Add scene to array list and sets time for each scene
//For example. If you have 3 scenes you would add t to total time three times. So if you had 
//3 Scenes, one for 1s, one for 2s, one for 3s. Total time would be 6s. and you would call addscene 3 times
public synchronized void addScene(Image i, long t)
{ 
    totaltime+=t;
    scenes.add(new OneScene(i, totaltime));

}
//start animation from beggininign inignngingingnig 
public synchronized void start(){
movietime = 0;
sceneindex = 0;
}
//change scenes 


//movie time is the sum of all the time passed from last update
//If you have more than one scene. timepassed gets added to movietime.
//if movietime is greater than or equal to total time(ie. animation is complete) restart the animation
public synchronized void update(long timepassed)
{
    if(scenes.size() > 1){
        movietime += timepassed;
        if(movietime >= totaltime)
        {
            movietime = 0;
            sceneindex = 0;

        }
        while(movietime > getScene(sceneindex).endTime)
        {
            sceneindex++;
        }
    }
}

public synchronized Image getImage(){
    if(scenes.size() == 0){
        return null;}
    else{
        return getScene(sceneindex).pic;
    }
}
//Getscene
private OneScene getScene(int x){
    return (OneScene)scenes.get(x);
}
//Scenes are gonna be 
private class OneScene{
    Image pic;
    long endTime;

    public OneScene(Image pic, long endTime)
    {
        this.pic = pic;
                this.endTime = endTime;

    }
}
}

アニメーション クラスを含めたのは、コンパイラがこれら 3 つのメソッド呼び出しを問題の原因として強調しているためです。

    a.update(timepassed); 
    MovieLoop(); 
     I.run(dm); 
4

1 に答える 1

1

注意:これは非常に長いコメントです

から始めましょうGraphics g = s.getFullScreenWindow().getGraphics();-getGraphicsは決して良い考えではありません。これは を返すことができnullます。

EDT 以外のスレッドから UI コンポーネントを更新しようと試みたり、更新したりしないでくださいpaintComponent

dispose自分で作成したものではないコンテキストは絶対に使用しないでくださいGraphics。これにより、他のコンポーネントがペイントされなくなります。

paint他の理由がなくダブル バッファリングされていない (トップ レベル コンテナー) 場合は、特にトップ レベル コンテナーのオーバーライドを避ける必要があり、他の子コンポーネントも上書きします。

詳細については、カスタム ペインティングの実行を参照してください。

ImageIOの代わりに使用してみてくださいImageIconImageIOファイルを読み取れない場合は例外がスローされますが、ImageIcon単にサイレントに失敗するため、あまり役に立ちません。

于 2013-04-04T23:41:43.867 に答える