【问题标题】:Problems with getClass().getResourceAsStream()getClass().getResourceAsStream() 的问题
【发布时间】:2021-02-23 23:54:52
【问题描述】:

我正在制作一个带有图形环境的项目,该环境使用文件中的缓冲图像。我进行了搜索,导出 jar 后我使用的方式(Java.IO 文件)不起作用,使用getClass().getResourceAsStream() 的方法是,但我在找出文件路径时遇到了麻烦

这是我在 eclipse-IDE 上的文件:

有人说我应该将资源文件夹移到 src 中 但我仍然不知道 res 中 image1.png 的文本是什么

我确实尝试过搜索和实施,但这给了我错误:

https://pastebin.com/MChSyWH5 这是我试图绘制图像的类在没有实现 getClass().getResourceAsStream() 的情况下的方式:

package src;



import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;







public class Menu {
    
    
    public Rectangle Playbutton = new Rectangle( Game.WIDTH/2-25, 60, 50, 10);
    public Rectangle Exitbutton = new Rectangle( Game.WIDTH/2-25, 80, 50, 10);
    public static String desc = null;
    
    private BufferedImage imagePlay;
    private BufferedImage players1;
    private BufferedImage players2;
    private BufferedImage imageExit;
    private BufferedImage IMPOSSIBLE;
    private BufferedImage Hard;
    private BufferedImage Easy;
    private BufferedImage Normal;
    private BufferedImage imageTitle;
    private BufferedImage imageResume;
    private BufferedImage imageMain;
    private BufferedImage OPTIONS;
    private BufferedImage BACK;
    public static int brightloss = 0;
    public static int stibaum = 0;
    public static boolean sti = true;
    public static boolean showc = false;
    public static enum STATE{
        MAIN,
        P1P2,
        INGAME,
        DIFICULTY, 
        OPTIONS
        
    };
    public static STATE State = STATE.MAIN;
    InputStream input = null;
    public static  STATE Statepre = State;
    public static boolean dark = true;
    public static Slider slider;
    
    public static void SAVESTATE(){
        Statepre = State;
        
        
    }

    public Menu() {
        
     try {
        input = new FileInputStream("res/Playbutt.png");
        } catch (IOException e) {
            e.printStackTrace(); 
        }
     
         String current;
        try {
            
        current = new java.io.File( "." ).getCanonicalPath();
         System.out.println("Current dir:"+current);
          String currentDir = System.getProperty("user.dir");
                 System.out.println("Current dir using System:" +currentDir);
                
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        slider = new Slider(100, 100, 50, false, brightloss);
        
        System.out.println(new File("res/Playbutt.png").getAbsolutePath()+"-arquivo");
        System.out.println(new File("/res/Playbutt.png").exists()+"-arquivo2");
       try { // ImageIO.read(new File("res/Playbutt.png"));              
          imagePlay = ImageIO.read(input);
          IMPOSSIBLE = ImageIO.read(new File("res/IMPOSSIbutt.png"));
          Hard = ImageIO.read(new File("res/Hardbutt.png"));
          Easy = ImageIO.read(new File("res/Easybutt.png"));
          Normal = ImageIO.read(new File("res/Normalbutt.png"));
          players1 = ImageIO.read(new File("res/1P.png"));
         
          players2 = ImageIO.read(new File("res/2P.png"));
          imageExit = ImageIO.read(new File("res/Exitbutt.png"));
          imageTitle = ImageIO.read(new File("res/Title.png"));
          imageResume = ImageIO.read(new File("res/Resumebutt.png"));
          imageMain = ImageIO.read(new File("res/Mainbutt.png"));
          OPTIONS = ImageIO.read(new File("res/Optbutt.png"));
          BACK = ImageIO.read(new File("res/Backbutt.png"));
       } catch (IOException ex) {
            // handle exception...
       }
    }
    

    
    
    public void render(Graphics g) {
        
        g.setFont(new Font("DefaultFont", Font.PLAIN, 10));
        g.setColor(Colors.Trans_GREEN3);
        g.fillRect(0, Game.HEIGHT-10, Game.WIDTH,10);
        g.fillRect(0, Game.HEIGHT-9, Game.WIDTH,9);
        g.fillRect(0, Game.HEIGHT-8, Game.WIDTH,8);
        g.fillRect(0, Game.HEIGHT-7, Game.WIDTH,7);
        g.fillRect(0, Game.HEIGHT-6, Game.WIDTH,6);
        g.fillRect(0, Game.HEIGHT-5, Game.WIDTH,5);
        g.setColor(Colors.Trans_GREEN3);
        g.fillRect(0, 0, Game.WIDTH,10);
        g.fillRect(0, 0, Game.WIDTH,9);
        g.fillRect(0, 0, Game.WIDTH,8);
        g.fillRect(0, 0, Game.WIDTH,7);
        g.fillRect(0, 0, Game.WIDTH,6);
        g.fillRect(0, 0, Game.WIDTH,5);
        g.setColor(Colors.Trans_GREEN3);
        g.fillRect(0, 0, 10,Game.HEIGHT);
        g.fillRect(0, 0, 9,Game.HEIGHT);
        g.fillRect(0, 0, 8,Game.HEIGHT);
        g.fillRect(0, 0, 7,Game.HEIGHT);
        g.fillRect(0, 0, 6,Game.HEIGHT);
        g.fillRect(0, 0, 5,Game.HEIGHT);
        g.setColor(Colors.Trans_GREEN3);
        g.setColor(Colors.Trans_GREEN3);
        g.fillRect(Game.WIDTH-10, 0, 10,Game.HEIGHT);
        g.fillRect(Game.WIDTH-9, 0, 9,Game.HEIGHT);
        g.fillRect(Game.WIDTH-8, 0, 8,Game.HEIGHT);
        g.fillRect(Game.WIDTH-7, 0, 7,Game.HEIGHT);
        g.fillRect(Game.WIDTH-6, 0, 6,Game.HEIGHT);
        g.fillRect(Game.WIDTH-5, 0, 5,Game.HEIGHT);
        
        Graphics2D g2d = (Graphics2D) g;
        
        if(State==STATE.MAIN) {
            
                if(MouseInput.mx>=95 && MouseInput.mx<=145) { 
                     if(MouseInput.my>60&&MouseInput.my<70) {
                         g.setColor(Colors.outline);
                    g.fillRect(Game.WIDTH/2-26, 59, 54, 14);
                    
                    
                    
                    }
                     else if(MouseInput.my>80&&MouseInput.my<90) {
                         g.setColor(Colors.outline);
                         g.fillRect(Game.WIDTH/2-26, 79, 54, 14);
                         
                         }
                     else if(MouseInput.my>40&&MouseInput.my<50) {
                         g.setColor(Colors.outline);
                         g.fillRect(Game.WIDTH/2-26, 39, 54, 14);
                         desc=("");
                         g.setColor(Color.green);
                         g.drawString(desc,45 , Game.HEIGHT/2+50);
                     }
                }
         g2d.drawImage(this.imageTitle,100,200,null);
         g2d.drawImage(this.OPTIONS, Game.WIDTH/2-25, 60, null);
         g2d.drawImage(this.imagePlay, Game.WIDTH/2-25, 40, null);
         g2d.drawImage(this.imageExit, Game.WIDTH/2-25, 80, null);
         
         double locationX = imageTitle.getWidth() / 2;
         double locationY = imageTitle.getHeight() / 2;
         AffineTransform tx = AffineTransform.getRotateInstance((Math.toRadians(stibaum)), locationX, locationY);
         AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);

            AffineTransform old = g2d.getTransform();
            
            g2d.drawImage(op.filter(imageTitle, null), Game.WIDTH/2-50, 10, null);
            
            g2d.setTransform(old);
            //things you draw after here will not be rotated
         }
        
        else if(State==STATE.INGAME) {
            if(MouseInput.mx>=95 && MouseInput.mx<=145) {
                 if(MouseInput.my>70&&MouseInput.my<80) {
                     g.setColor(Colors.outline);
                     g.fillRect(Game.WIDTH/2-26, 69, 54, 14);
                
                }
                 else if(MouseInput.my>90&&MouseInput.my<100) {
                     g.fillRect(Game.WIDTH/2-26, 89, 54, 14);
                     }else if(MouseInput.my>50&&MouseInput.my<60) {
                         g.setColor(Colors.outline);
                         g.fillRect(Game.WIDTH/2-26, 49, 54, 14);
                         
                     }
                 
            }
            g2d.drawImage(this.imageResume, Game.WIDTH/2-25, 70, null);
            g2d.drawImage(this.imageMain, Game.WIDTH/2-25, 50, null);
            g2d.drawImage(this.imageExit, Game.WIDTH/2-25, 90, null);
             g2d.drawImage(this.imageTitle, Game.WIDTH/2-50, 10, null);}
        
        else if(State==STATE.P1P2) {
            if(MouseInput.mx>=15 && MouseInput.mx<=40) {
                 if(MouseInput.my>=106&&MouseInput.my<118) { 
                     g.setColor(Colors.outline);
                     g.fillRect(14, Game.HEIGHT-29, 28, 15);
                     desc=("");
                     g.setColor(Color.green);
                     g.drawString(desc,45 , Game.HEIGHT/2+50);
                     
                 }}
            if(MouseInput.my>30&&MouseInput.my<90) {
                 if(MouseInput.mx>=60 && MouseInput.mx<=120) {
                     g.setColor(Colors.outline);
                     g.fillRect(Game.WIDTH/2-61, 29,66, 66);    
                
                     
        }
                 if(MouseInput.mx>=130 && MouseInput.mx<=190) {
                     g.setColor(Colors.outline);
                     g.fillRect(Game.WIDTH/2+9, 29,66, 66);
                        
                     
        }}
            g2d.drawImage(this.players1, Game.WIDTH/2-60, 30, null);
            g2d.drawImage(this.players2, Game.WIDTH/2+10, 30, null);
            g2d.drawImage(this.BACK, 15, Game.HEIGHT-28, null);
        }
        else if(State==STATE.DIFICULTY) {
            if(MouseInput.mx>=15 && MouseInput.mx<=40) {
                 if(MouseInput.my>=106&&MouseInput.my<118) { 
                     g.setColor(Colors.outline);
                     g.fillRect(14, Game.HEIGHT-29, 28, 15);
                     desc=("");
                     g.setColor(Color.green);
                     g.drawString(desc,45 , Game.HEIGHT/2+50);
                     
                 }}
            if(MouseInput.mx>=95 && MouseInput.mx<=145) {
                 if(MouseInput.my>70&&MouseInput.my<80) {
                     g.setColor(Colors.outline);
                     g.fillRect(Game.WIDTH/2-26, 69, 54, 14);
                     g.setColor(Color.green);
                     desc=("for those who want challenge");
                     g.drawString(desc,50 , Game.HEIGHT/2+50);
                
                }
                 else if(MouseInput.my>90&&MouseInput.my<100) {
                     g.setColor(Colors.outline);
                     g.fillRect(Game.WIDTH/2-26, 89, 54, 14);
                     desc=("for those who want to cry");
                     g.setColor(Color.green);
                     g.drawString(desc,70 , Game.HEIGHT/2+50);
                     }else if(MouseInput.my>50&&MouseInput.my<60) {
                         g.setColor(Colors.outline);
                         g.fillRect(Game.WIDTH/2-26, 49, 54, 14);
                         desc=("for those who want to play casually");
                         g.setColor(Color.green);
                         g.drawString(desc,45 , Game.HEIGHT/2+50);
                         
                         
                     }if(Ball.pmih) {
                      if(MouseInput.my>33&&MouseInput.my<44) {
                         g.setColor(Colors.outline);
                         g.fillRect(Game.WIDTH/2-26, 32, 54, 14);
                         desc=("for those who don't really have a life");
                         g.setColor(Color.green);
                         g.drawString(desc,45 , Game.HEIGHT/2+50);
                     }}
                 
            }
            if(Ball.pmih) {
            g2d.drawImage(this.IMPOSSIBLE, Game.WIDTH/2-25, 33, null);}
            g2d.drawImage(this.Normal, Game.WIDTH/2-25, 70, null);
            g2d.drawImage(this.Easy, Game.WIDTH/2-25, 50, null);
            g2d.drawImage(this.Hard, Game.WIDTH/2-25, 90, null);
            g2d.drawImage(this.imageTitle, Game.WIDTH/2-50, 10, null);
             g2d.drawImage(this.BACK, 15, Game.HEIGHT-28, null);
            
            
                
                     
        }
        else if(State==STATE.OPTIONS) {
            if(MouseInput.mx>=15 && MouseInput.mx<=40) {
                 if(MouseInput.my>=106&&MouseInput.my<118) { 
                     g.setColor(Colors.outline);
                     g.fillRect(14, Game.HEIGHT-29, 28, 15);
                     desc=("");
                     g.setColor(Color.green);
                     g.drawString(desc,45 , Game.HEIGHT/2+50);
                     
                 }}
            
            
            
            
            slider.render(g);
             g2d.drawImage(this.imageTitle, Game.WIDTH/2-50, 10, null);
             g2d.drawImage(this.BACK, 15, Game.HEIGHT-28, null);
        
             
        }
        
        
    }




    public void tick() {
        slider.tick();
        if(stibaum<5&&sti==true) {
            stibaum+=1;
        }
        if(stibaum>=5&&sti==true) {sti=false;}
        if(stibaum>-5&&sti==false) {
            stibaum-=1;
        }
        if(stibaum<=-5&&sti==false) {sti=true;}
        if(State==STATE.OPTIONS) {
            Statepre=STATE.MAIN;
        }
        else if(State==STATE.P1P2) {
            Statepre=STATE.MAIN;
        }
        else if(State==STATE.DIFICULTY) {
            Statepre=STATE.P1P2;
        }
        
    }
    
    
}

【问题讨论】:

    标签: java eclipse filepath bufferedimage embedded-resource


    【解决方案1】:

    input = new FileInputStream("res/Playbutt.png");

    这不起作用。你不能使用 FIS,你必须使用Menu.class.getResource。不是getClass()

    ImageIO.read(new File("res/2P.png"));

    这里也一样。

    } catch (IOException ex) {
         // handle exception...
    }
    

    这不是你做这些事情的方式。摆脱这一切,并将throws IOException 添加到构造函数中。 public static void main 可以并且通常应该声明为throws Exception。您忽略了错误,使调试此问题变得更加困难。因此,不要这样做。

    您的任何代码都没有尝试使用Main.class.getResource

    res 在 Eclipse 项目中未标记为源目录。你需要解决这个问题。你有两个选择:

    1. 忘记res 目录。将您的图像放在与您的 java 文件完全相同的位置。只需将它们移到那里 - 然后getResource 就可以正常工作了。例如,如果img.pngMain.java 位于同一目录(完全相同的目录!),则Main.class.getResource("img.png") 可以正常工作。

    2. 使用 maven,然后将此项目更改为基于 maven 的项目。然后eclipse会处理它。

    【讨论】:

    • 我是否可以不完全摆脱 res 将其放在我的 Java 文件夹中,然后使用 Main.class.getResource("res/img.png") 之类的东西?
    • 那么你必须使用"/res/img.png"(注意前导斜杠。没有那个前导斜杠,你将从Main.java文件所在的包中取出,..是不合法的在这些字符串中)。
    • 我尝试过,它在导出之前运行良好,但在我通过 cmd 运行它之后它给了我:线程“main”java.lang.IllegalArgumentException 中的异常:输入 == null!在 java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400) 在 src.Menu.(Menu.java:91) (女巫是 imagePlay = ImageIO.read(Menu.class.getResource(" Playbutt.png"));) 在 src.Game.(Game.java:100) 处初始化游戏内的菜单在 src.Game.main(Game.java:114) 处初始化游戏
    • getResourceAsStream 如果不存在则返回 null,因此,您的资源不存在。我无法根据评论为您调试它。使用jar tvf myjar.jar 检查图像是否存在,并且在适当的位置。将调用 Main.class.getResource("Main.class") 的结果打印到 systemout 以查看这段代码的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2010-11-22
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多