2015-03-07 4 views
0

Пытается установить значок изображения для JLabel, но возвращает URL-адрес null?Попытка установить значок изображения для JLabel, но URL-адрес возвращается null

Я использую Netbeans и включил background.png в свой проект, но он все равно возвращает null?

import java.awt.image.BufferedImage; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class NewClass extends JFrame { 

    JLabel o = new JLabel(); 

    public NewClass() { 
     createImage("background.png"); 
     add(o); 
     setVisible(true); 
     setSize(100, 100); 
     setResizable(false); 
    } 

    public static void main(String[] args) { 
     new NewClass(); 
    } 

    public void createImage(String str) { 
     URL url = getClass().getResource(str); 
     try { 
      BufferedImage image = ImageIO.read(url); 
      o.setIcon(new ImageIcon(image)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

Сведения об ошибках в трассировки стека:

java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(ImageIO.java:1388) 
    at Test.NewClass.createImage(NewClass.java:32) 
    at Test.NewClass.<init>(NewClass.java:18) 
    at Test.NewClass.main(NewClass.java:26) 

Пожалуйста, не могли бы вы помочь не уверены, почему это не работает, когда я пытаюсь

JLabel o = new JLabel(new ImageIcon("background.png"); 

Это работает, но это чревато ошибками упаковывают background.png не существует? Thankyou

EDIT: компоненты-SplitPaneDemo2Project - где это название NetBeans проекта & фона PNG непосредственно внутри этой папки

расположен здесь: C: \ Users \ John \ Documents \ NetBeansProjects \ компоненты-SplitPaneDemo2Project

Скриншот:

enter image description here

+0

Где 'background.png' находится? Похоже, что «background.png» не найден. –

+0

Что вы подразумеваете под "error prone"? Этот файл изображения является частью вашего приложения. Вы можете убедиться, что он существует. – yole

+0

http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html Я следовал этому руководству, и они упомянули о грамотной обработке ошибок? Я также пытаюсь понять, почему этот конкретный метод не работает, даже если он всегда является частью приложения. Я редактировал его там, где он находится. – Als

ответ

2

Я тестировал код с некоторыми изменяется и работает нормально:

public class NewClass extends javax.swing.JFrame { 

    JLabel o = new JLabel(); 

    public NewClass() { 
     initComponents(); 

     createImage("background.png"); 
     add(o); 
     setVisible(true); 
     setSize(100, 100); 
     setResizable(false); 

     o.setLocation(20, 20); 
     o.setSize(100, 25); 
    } 

    public void createImage(String str) { 
     URL url = getClass().getResource(str); 
     try { 
      BufferedImage image = ImageIO.read(url); 
      o.setIcon(new ImageIcon(image)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
.... 
} 

В конструкторе Я установил местоположение и размер для 'o'.

«background.png» должен быть в родительском пакете «NewClass».

enter image description here

enter image description here

+0

Спасибо, вы правы Я ставлю папку src/test, а затем очистил и построил проект в netbeans. Однако, так или иначе, я получаю его более удобным, помещая его в отдельную папку под названием pic в C: \ Users \ John \ Documents \ NetBeansProjects \ components-SplitPaneDemo2Project \ pic, а затем как-то ссылается туда, вместо того, чтобы иметь грязные изображения, отображаемые внутри проекта package - Также, когда я работал в командной строке и имел образ и класс в той же папке, он тоже работал отлично? – Als

+0

Да, вы можете пойти этим путем, но этим вы будете использовать абсолютный путь к изображениям, которые могут вызвать приложение, зависит от файловой системы.Если вы используете изображения в своем приложении, эта проблема никогда не возникает. –

+0

* «В любом случае я получаю его, чтобы выглядеть более чистым, поместив его в отдельную папку» * Это хрупкое и потерпит неудачу на следующей машине. Поместите изображение в банку. Это единственный разумный подход. Когда вы становитесь более опытными, вы можете поместить все изображения в один Jar, который будет добавлен в класс времени выполнения основного Jar, но придерживаться простого способа (как видно из этого ответа) в ближайшем будущем. –