1

Java でグラフィックスを試し、ドミノ ゲームを作成しています。しかし、私は別の不思議な小さな「挑戦」に出くわしました...今回は本当にIDEをチェックしたと思います

とにかくここに私のコードがあります:

// In the main class
import java.awt.Color;
import javax.swing.JFrame;
public class GameBoard extends JFrame {
    public static void main(String[] args) {
        JFrame game = new JFrame();
        game.setTitle("Domino");
        game.setSize(800, 600);
        game.setDefaultCloseOperation(EXIT_ON_CLOSE);
        game.setBackground(Color.GREEN);
        Domino double6 = new Domino("images/double_6.png",16,16,'H',6,6);
        game.add(double6);
        // Create pieces
        game.setVisible(true);
    }
}

// The game piece class
package domino;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Domino extends JPanel {
    // Instance variables for each piece
    public int n1, n2, x, y;
    public char position;
    // n1 is the first number, n2 is the second number, x and y are coordinates, position refers to horizontal or vertical (ideally would be a different image for each direction)
    public BufferedImage img = null;
    public String fileName;

    // Constructor
    public Domino(String fileName, int x, int y, char position, int n1, int n2) {
        this.fileName = fileName;
        this.x = x;
        this.y = y;
        this.n1 = n1;
        this.n2 = n2;
        this.position = position;
        repaint();
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (this.position == 'H') {
        try {
            // Here's where the trouble appears to rear its ugly head...
            img = ImageIO.read(new File(fileName));
            g.drawImage(img, this.x, this.y, null);
        } catch (IOException ex) {
            // This code was generated by the system - it wouldn't even let me do the drawImage code about without a try/catch.
            Logger.getLogger(Domino.class.getName()).log(Level.SEVERE, null, ex);
        }
    } else {
            // If all else fails I can at least draw the game pieces manually.
            g.setColor(Color.WHITE);
            g.fillRect(this.x, this.y, 32, 64);
            // etc.
        }
    }
}

とにかく、実行すると、次のようになります。

run:
Jul 04, 2013 11:33:13 PM domino.Domino paintComponent
SEVERE: null
javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(ImageIO.java:1301)
    at domino.Domino.paintComponent(Domino.java:43)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent.paint(JComponent.java:1040)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
    at java.awt.Container.paint(Container.java:1967)
    at java.awt.Window.paint(Window.java:3877)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:807)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Jul 04, 2013 11:33:14 PM domino.Domino paintComponent
SEVERE: null
javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(ImageIO.java:1301)
    at domino.Domino.paintComponent(Domino.java:43)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paint(JComponent.java:1063)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:585)
    at javax.swing.JComponent.paintChildren(JComponent.java:887)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent.paint(JComponent.java:1040)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
    at java.awt.Container.paint(Container.java:1967)
    at java.awt.Window.paint(Window.java:3877)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:807)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

BUILD SUCCESSFUL (total time: 6 seconds)

だから私はいくつかの研究をしました。まず、Java/Oracle の Web サイトにアクセスして、画像の描画に関するチュートリアルを見つけました (実際、私のコードは、少なくとも try/catch の部分は、彼らのコードに非常に密接に基づいています)。次に、例外が何であるかを確認するために、try/catch を削除しようとしました (1 つあると 99% 確信していました、笑)。さて、私の IDE (NetBeans) は、バグを出して、基本的に私に 1 つを使用するように強制することで応答しました。そこで、プロジェクト フォルダーに移動し、ファイルが適切な場所にあることを確認しました (そうでした)。念のため、プロジェクト内の他のすべてのフォルダーにコピーして、それが役立つかどうかを確認しました。そうではありませんでした。

したがって、私が何か間違ったことをしたことは痛々しいほど明らかであり、何らかの理由で Java はファイルが存在し、正しい場所 (そして現在はすべての場所) にあるにもかかわらず、ファイルを読み取ることができないか、読み取れませんが、他に何があるかわかりません。それについてすること。

ですから、いつものように、私はどんなアイデア、提案、その他の情報にもオープンです。前もって感謝します。: )

4

3 に答える 3

4

現在の作業ディレクトリを確認してください: Geting the current working directory in Java . フォルダーを含むimagesフォルダーである必要がありますが、おそらくそうではないため、例外です。

于 2013-07-05T07:11:22.033 に答える
3

エラーメッセージは

javax.imageio.IIOException: Can't read input file!

スタック トレースによると、Domino.java の 43 行目で ImageIO.read を呼び出すと発生します。

ロードするファイルが存在し、読み取り可能であり、相対パス (images/double_6.png) がプログラムを実行するディレクトリからの相対パスであることを確認してください。

于 2013-07-05T07:11:08.447 に答える
1

images/ の部分をパスから外し、ファイルが exe と同じディレクトリにあることを確認するとどうなりますか? だから、代わりに

Domino double6 = new Domino("images/double_6.png",16,16,'H',6,6);

試す

Domino double6 = new Domino("double_6.png",16,16,'H',6,6);

プログラムを実行しているディレクトリと同じディレクトリをチェックする必要があります。

于 2013-07-05T07:12:13.780 に答える