0

私はまだJavaにかなり慣れていませんが、これは起こらないはずだと確信しています。私の paintComponent メソッドに奇妙な論理エラーがあり、画像が正しく描画されません。通常、これは問題にはならず、回避する方法を見つけることができました。ただし、問題は常に存在するとは限りません。IDE を閉じて再度開く場合と同様に、一度に 1 行ずつコメントを付けたりコメントを外したりすると、問題が回避されることがあります。(Eclipse.) 何が原因で、それを避けるために何ができるでしょうか?

これが私の方法です:

public void paintComponent(Graphics g){
    g.drawImage(titlebg, 0, 0, null);
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(300, 250, 300, 50);
    //g.fillRect(400, 400, 300, 50);
    g.drawImage(ccground, 0, 0, null);
}

編集: setColor および fillRect メソッドのコメントが外されている場合、drawImage メソッドは機能しません。2人だけだとうまくいかないこともあります。時々彼らはそうします。

編集 2: 画像への唯一の他の呼び出しは、それらを初期化する次のコードにあります。

Toolkit tk = Toolkit.getDefaultToolkit();

public Image retrieveImage(String x){
    URL y = this.getClass().getResource(x);
    Image img = tk.getImage(y);
    return img;
}

これは次のように参照されています。

public void loadImages(){
    ccground = rl.retrieveImage("\\Chrysaline Caverns ground tile.png");
    titlebg = rl.retrieveImage("\\Title Screen.png");
}

paintComponent メソッドと同じクラスにあります。

編集 3: スタック トレース。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at gui.Main.createGui(Main.java:32)
at gui.Main$1.run(Main.java:21)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Main.class

public class Main extends JFrame{
static Window w;
JFrame f;
Image ccground;
Main(){
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            createGui();
        }
    });

}
public static void main(String[] args){
    w = new Window();
}
public void createGui(){
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(w);
    f.pack();
    f.setVisible(true);
    f.setBackground(Color.BLACK);
}
}

編集 4: Window.java

public class Window extends JPanel{
Main m;
ResourceLoader rl;
Image ccground;
Image titlebg;
public Window(){
    rl = new ResourceLoader();
    m = new Main();
    loadImages();
}
public Dimension getPreferredSize(){
    return new Dimension(800, 592);
}
public void loadImages(){
    ccground = rl.retrieveImage("\\Chrysaline Caverns ground tile.png");
    titlebg = rl.retrieveImage("\\Title Screen.png");
}
public void paintComponent(Graphics g){
    g.drawImage(titlebg, 0, 0, null);
    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(300, 250, 300, 50);
    //g.fillRect(400, 400, 300, 50);
    g.drawImage(ccground, 0, 0, null);
}
}
4

1 に答える 1

2

Toolkit.getDefaultToolkit().getImage(url) が原因です。このメソッド、必ずしもまだロードされていないイメージ (ある意味では空のダミー) を取得します。画像が確実に読み込まれるようにするために何もしないため、読み込まれる場合と読み込まれない場合があります。

イメージを使用する前にイメージが完全にロードされていることを確認する多くの方法の 1つは (私が知っている最短の方法)、使用する前に Toolkit から取得した各イメージに対してこれを実行することです。

新しい ImageIcon(画像).getImage();


編集:

次のようにretrieveImageを変更すると、動作するか、画像が見つからなかったことを明確に示します。

public Image retrieveImage(String x){
    URL y = this.getClass().getResource(x);
    Image img = tk.getImage(y);
    if (img == null)
        throw new IllegalArgumentException("image " + x + " not found");
    return new ImageIcon(img).getImage();
}
于 2012-06-27T16:20:47.687 に答える