Установка значка на JButton вызывает NPE

Это моя первая попытка использовать графический интерфейс, и я пытаюсь установить значок JButton. Независимо от того, как я это кодирую, я получаю NPE. Я отметил строку, где происходит NPE. Мне удалось передать URL-адрес методу setIcon, но это никогда не влияет на графический интерфейс. Я также пробовал этот код, используя значок вместо значка изображения, без изменений. Любой совет будет очень полезен. Спасибо.

static Random roll = new Random();

handCard1 = new javax.swing.JButton();       //this has been initialized through a series of methods that initialized the GUI

public static void main(String args[]) 
{

    yourHand.setCard1(rollForCard.getCard());         //randomly set to fire, water or wind


    if (yourHand.getCard1().equals("fire"))

            handCard1.setIcon(SetIcon.setFireIcon()); //NPE here



           //I also tried a simple       handCard1.setIcon(fire);
           //with this before the main   ImageIcon fire = new ImageIcon("fire.jpg");

}//end main

УстановитьЗначок...

import javax.swing.ImageIcon;

public class SetIcon 
{

public static ImageIcon setFireIcon()
{
    ImageIcon fire = (new ImageIcon("fire.jpg"));

    //I have also tried: ImageIcon fire = (new javax.swing.ImageIcon(getClass().getResource("fire.jpg")));
    //and:           ImageIcon fire = new ImageIcon(getClass().getResource("fire.jpg")));
    return fire;
}

}

person Sev    schedule 06.08.2013    source источник
comment
На ум приходят две вещи. 1- hardCard1 равно null или 2- значок fire не имеет значения. Я бы рекомендовал использовать ImageIO, а не ImageIcon, так как вы получите лучшую обратную связь, если файл не может быть прочитан. Также помните, что ImageIcon(String) переводит String в ссылку на файл. Если значок встроен, это не сработает. Кроме того, изучив код, я не понимаю, как ваша программа может компилироваться. Вы обращаетесь к handCard1 из контекста static, а handCard1 не является static...   -  person MadProgrammer    schedule 07.08.2013
comment
Я попытался сделать handCard1 статическим, но получаю, что handCard1 не может быть преобразован в тип.   -  person Sev    schedule 07.08.2013
comment
Я думаю, вместо этого следует читать private static JButton handCard1 = new javax.swing.JButton();?   -  person MadProgrammer    schedule 07.08.2013
comment
Значок, ImageIcon по умолчанию никогда не вызывал никаких исключений, вы должны проверить, не является ли он нулевым, проблема находится где-то в остальной части вашего кода.   -  person mKorbel    schedule 07.08.2013


Ответы (1)


ну, ваша handCard1 может быть нестатической переменной, в то время как ваша процедура установки значка выполняется статическим методом. Обычно мы используем метод main для экземпляра объектов, и это то, что вы должны сделать, создать новый экземпляр класса и переместить код в конструкторе, и ваш NPE исчезнет или объявит handCard1 как статический.
EDIT1: Также, если ваш handCard1 уже статичен, NPE, вероятно, появляется из-за неправильного пути в вашем методе setIcon, этот значок должен быть помещен в ваш каталог java.exe, если вы не настроили какие-либо пути к классам. лучший способ исправить это - импортировать это изображение в проект eclipse/netbeans в качестве ресурса и получить к нему доступ как путь к ресурсу.

person Claudiu C    schedule 06.08.2013
comment
Что вы имеете в виду, когда говорите, двигайте треску? - person Sev; 07.08.2013
comment
неважно, handCard1 должен быть статическим, если компилятор не выдает ошибку, поэтому проблема связана с тем путем, который вы используете. прочитайте мою правку. - person Claudiu C; 07.08.2013
comment
что-то вроде возврата нового javax.swing.ImageIcon(getClass().getResource(/resource/fire.jpg)) , где ресурс - это папка, содержащая вашу картинку - person Claudiu C; 07.08.2013