如何";真的吗;在Java应用程序中绘制图像

如何";真的吗;在Java应用程序中绘制图像,java,image,swing,jpanel,paintcomponent,Java,Image,Swing,Jpanel,Paintcomponent,我正在用Java进行图形实验,创建一个domino游戏。然而,我遇到了另一个神秘的小“挑战”。。。我想这次我真的把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 ga

我正在用Java进行图形实验,创建一个domino游戏。然而,我遇到了另一个神秘的小“挑战”。。。我想这次我真的把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网站,找到了他们的教程 在绘制图像时(事实上,我的代码与它们非常接近,至少 尝试/抓住部分)。然后我尝试删除try/catch,看看异常是什么 会的(我99%肯定会有,哈哈)。我的IDE(NetBeans)的响应是 窃听并基本上强迫我使用一个。然后我进入了项目文件夹 并检查以确保文件位于正确的位置。那就见鬼去吧 当然,我把它复制到项目中的每个其他文件夹中,看看这是否有帮助。信息技术 没有

所以很明显我做错了什么,无论出于什么原因Java都做不到,或者 不会读取该文件,即使该文件存在并且位于正确的位置(现在每个 但我不知道还有什么办法

所以,和往常一样,我对任何想法、建议或其他信息都持开放态度。提前感谢。:)

错误消息为

javax.imageio.IIOException: Can't read input file!
根据堆栈跟踪,当您在Domino.java的第43行调用ImageIO.read时,就会发生这种情况

确保要加载的文件存在且可读,并且相对路径(images/double_6.png)相对于执行程序的目录。

错误消息为

javax.imageio.IIOException: Can't read input file!
根据堆栈跟踪,当您在Domino.java的第43行调用ImageIO.read时,就会发生这种情况


确保要加载的文件存在且可读,并且相对路径(images/double_6.png)与执行程序的目录相对。

检查当前工作目录:。它应该是包含
图像的文件夹
文件夹,但可能不是,因此出现异常。

检查您当前的工作目录:。它应该是包含
图像的文件夹
文件夹,但可能不是,因此例外。

如果将图像/零件从路径中取出,并确保文件与exe位于同一目录中,会发生什么情况?因此,与其

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


这应该检查与运行程序所在的目录相同的目录

如果将图像/零件从路径中取出,并确保文件与exe位于同一目录中,会发生什么情况?因此,与其

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


这应该检查与运行程序所在的目录相同的目录

这是一个还是两个文件?文件在哪里?它应该是Jar文件中的嵌入式资源,还是存在于硬盘上?这是一个文件还是两个文件?文件存在于哪里?它应该是Jar文件中的嵌入式资源,还是存在于硬盘上?它是java,没有exe。就是这样!谢谢!:)感谢所有做出贡献的人。我真的很感激。你使用的操作系统是什么?也许您应该使用
文件
classIt的java中的
路径分隔符
方法-没有exe。就是这样!谢谢!:)感谢所有做出贡献的人。我真的很感激。你使用的操作系统是什么?也许您应该使用
文件
类中的
路径分隔符
方法