Erro de NullPointerException

10 respostas Resolvido
java
Splayer

Estou tentando fazer com que várias JLabel sejam criadas por um sistema de repetição, porém está dando erro.

JLabel[] botao = new JLabel[3];
    int x = 0;
for (final JLabel button : botao) {
        button.setIcon(new ImageIcon(getClass().getResource(image)));
        button.setBounds(300, 100 + (x * 50), 160, 40);
        add(button);
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource("botao_menu1.png")));
                button.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }
@Override
            public void mouseReleased(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource("botao_menu.png")));
            }
        });
    x++;
    }

10 Respostas

Frmichetti

Posta a Exception e a Classe Completa…
Mas Batendo o olho, bem provavelmente que está dando estouro nos métodos setIcons…
Talvez não ele esteja encontrando o path dos icons.

Tipo essa linha aqui
button.setIcon(new ImageIcon(getClass().getResource(image)));

image? está faltando a extensão e as aspas … verifica ai.

Splayer

Class.java

package calculadorarpg;

import java.awt.Cursor;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

public class JButtonDiferente extends JFrame {

public JButtonDiferente() {
    this.setSize(600, 400);
    this.setResizable(false);
    this.setLayout(null);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void botaoDiferente(String image, String image1) {
    JLabel[] botao = new JLabel[3];
    int x = 0;
for (JLabel button : botao) {
        button.setIcon(new ImageIcon(getClass().getResource(image)));
        button.setBounds(300, 100 + (x * 50), 160, 40);
        add(button);
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource(image1)));
                button.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }
@Override
            public void mouseReleased(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource(image)));
            }
        });
        x++;
    }
}
public static void main(String[] args) {
    new JButtonDiferente().botaoDiferente("botao_menu.png", "botao_menu1.png");
}
}

Erro:

Exception in thread main java.lang.NullPointerException

at jbuttondiferente.JButtonDiferente.botaoDiferente(JButtonDiferente.java:26)

at jbuttondiferente.JButtonDiferente.main(JButtonDiferente.java:46)
Frmichetti

Erro nesta linha
button.setIcon(new ImageIcon(getClass().getResource(image)));

Troque por
button.setIcon(new ImageIcon(getClass().getResource("sua_imagem_aqui.png")));

Splayer

Mesmo erro:

Exception in thread main java.lang.NullPointerException

at calculadorarpg.JButtonDiferente.botaoDiferente(JButtonDiferente.java:26)

at calculadorarpg.JButtonDiferente.main(JButtonDiferente.java:46)
Frmichetti

Bom avancei mas está acontecendo outros problemas nesse código…

for (JLabel button : botao) {
	
	//Aqui estava faltando instanciar
	button = new JLabel();
	
        button.setIcon(new ImageIcon(getClass().getResource(image)));

        button.setBounds(300, 100 + (x * 50), 160, 40);
        add(button);
      
        /*
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource(image1)));
                button.setCursor(new Cursor(Cursor.HAND_CURSOR));
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                button.setIcon(new ImageIcon(getClass().getResource(image)));
            }
        });
        */
        
        x++;
    }

Ele parou com os Nulls ,porem esse método do Mouse listener está gerando outra exception.

Deixei comentado este trecho, estou pesquisando…

Splayer

E porque você colocou como comentário os Listener?

Frmichetti

Local variable button defined in an enclosing scope must be final or effectively final

Splayer

coloca assim:

for (final JLabel button : botao) {

Frmichetti
Solucao aceita

Da um Ctrl c e Control v ai

import java.awt.Cursor;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class JButtonDiferente extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1308478526338090786L;
 

public JButtonDiferente() {
    this.setSize(600, 400);
    this.setResizable(false);
    //Coloquei um layout Grid para Organizar melhor aqui os Botões lado a lado
    //Aqui pelas minhas imagens ficou torto 
    this.setLayout(new GridLayout());
    this.setLocationRelativeTo(null);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void botaoDiferente(String image, String image1) {
    
    JLabel[] botao = new JLabel[3];  
    
   
    int x = 0;

    for (JLabel button : botao) {
	
	//ERRO 1
	//Aqui estava faltando instanciar
	//Então você estava setando um icone em objeto não inicializado.
	button = new JLabel();
	
        button.setIcon(new ImageIcon(getClass().getResource(image)));
        
        button.setBounds(300, 100 + (x * 50), 160, 40);
        
        add(button);
        
        //ERRO 2
        //Tive que esternalizar o método para contornar o erro
        //Local variable button defined in an enclosing scope must be final or effectively final
        addListener(button,image,image1);        
        
        x++;
    }
}

private void addListener(JLabel button,String image,String image1){
    
    button.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            button.setIcon(new ImageIcon(getClass().getResource(image1)));
            button.setCursor(new Cursor(Cursor.HAND_CURSOR));
            
            System.out.println("Mouse Pressed");

            
            
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            button.setIcon(new ImageIcon(getClass().getResource(image)));
            
            System.out.println("Mouse Released");
        }
    });
    
};

public static void main(String[] args) {
    
    //Utilize esse Método para invocar um Jframe, Antigamente estava criando a Janela e Desenhando de Forma Incorreta Exibindo a imagem cortada
    SwingUtilities.invokeLater(()->{
	new JButtonDiferente().botaoDiferente("botao_menu.png", "botao_menu1.png");
    });
    
}
}

A explicação do Erro 2 está aqui:

Splayer

Uoou!
Funcionou, vlw!

Criado 2 de fevereiro de 2017
Ultima resposta 2 de fev. de 2017
Respostas 10
Participantes 2