2015-12-12 107 views
1

我在Eclipse中编写了一个程序,当它运行时它工作正常。与jar文件和图像的问题

public static void initialize() throws IOException{  

    JTextField tfQrText; 
    int size = 250; 
    File qrFile; 
    BufferedImage qrBufferedImage; 

    JFrame gui = new JFrame("qrCode Generator"); 
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    gui.setSize(250, 340); 
    gui.setLayout(new BorderLayout()); 
    gui.setResizable(false); 


    File iconFile = new File(VisualQrCodeGenerator.class.getResource("icon.png").getFile());  
    BufferedImage iconBuffered = ImageIO.read(iconFile); 
    gui.setIconImage(iconBuffered); 

    JButton generate = new JButton("Generate qrCode"); 
    gui.add(generate,BorderLayout.SOUTH); 

    tfQrText = new JTextField(); 
    PromptSupport.setPrompt("Enter Your Text ... ", tfQrText); 
    gui.add(tfQrText,BorderLayout.NORTH); 


    qrFile = new File(VisualQrCodeGenerator.class.getResource("qrCodeImage.png").getFile()); 
    qrBufferedImage = ImageIO.read(qrFile); 
    ImageIcon qrImageIcon = new ImageIcon(qrBufferedImage); 

    JLabel image = new JLabel(); 
    image.setIcon(qrImageIcon); 

    image.setHorizontalAlignment(JLabel.CENTER); 

    gui.add(image,BorderLayout.CENTER); 

    gui.setVisible(true); 
    generate.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      if(!(tfQrText.getText().equals(""))){ 
       //create() Method make the QRcode Image 
       create(); 
      }    
     } 
    }); 

的错误发生在行:

BufferedImage iconBuffered = ImageIO.read(iconFile); 

当我让.jar文件,它说: Opening file with windows CMD to know why it won't open

我的项目结构是这样的:

+src 
+qrCodeGenerator 
    -VisualQrCodeGenerator 
    -icon.png 
    -qrCodeImage.png 

代码运行正常,没有任何错误在程序中,我可以使用它。但是当我制作.jar文件时,它会让我错误地上传图片。

回答

1

这是正常现象:您无法以类似File的对象访问类路径资源。这是因为它嵌入在JAR中。它在IDE内工作,因为资源通常存储在临时文件夹内(而不是在JAR内)。

您需要使用InputStream使用Class.getResourceAsStream来访问它,并使用ImageIO.read(InputStream)来代替。

因此,您的代码更改为:

qrBufferedImage = ImageIO.read(VisualQrCodeGenerator.class.getResourceAsStream("qrCodeImage.png")); 

+0

虽然这是事实,如果资源不存在,你会得到一个NPE。最好的方法是首先'.getResource()',检查结果是否为空,然后是'.openStream()'这个资源(它是一个URL对象)。 – fge

+0

@fge是的,但如果资源不存在,则拥有NPE也可以快速失败。 – Tunaki

+0

当然,但你可以检测到,并抛出一个更好的例外;) – fge