Imagem JLabel

Bom dia Galera!
Estou tentando colocar um logo na lateral do meu sistema, porem ele está me retornando um erro.

package br.com.warehouse.telas;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JDesktopPane;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.SwingConstants;

public class TelaPrincipal extends JFrame {
	private JPanel contentPane;


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TelaPrincipal frame = new TelaPrincipal();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TelaPrincipal() {
		setResizable(false);
		setTitle("Lovato - Sistema de Estoque Aliment\u00EDcio");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 880, 600);
				
		JLabel lblLogo = new JLabel("");
		lblLogo.setBounds(660, 40, 200, 200);

		ImageIcon imagem = new ImageIcon(TelaPrincipal.class.getResource("E:\\Sistema\\workspace\\prjwarehouse\\src\\\\br\\com\\warehouse\\icones\\logo.png"));
		Image imag = imagem.getImage().getScaledInstance(lblLogo.getWidth(), lblLogo.getHeight(), Image.SCALE_DEFAULT);
		lblLogo.setIcon(new ImageIcon(imag));

Porem, quando eu executo ele me retorna um erro:

java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at br.com.warehouse.telas.TelaPrincipal.<init>(TelaPrincipal.java:54)
	at br.com.warehouse.telas.TelaPrincipal$1.run(TelaPrincipal.java:33)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$500(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

O caminho da imagem está correto…
Ele roda quando eu tiro a instancia ImageIcon imagem = new ImageIcon

Por que isso está acontecendo ?

O seguinte método está retornando null:
TelaPrincipal.class.getResource("E:\\Sistema\\workspace\\prjwarehouse\\src\\\\br\\com\\warehouse\\icones\\logo.png")

Não use caminhos absolutos, coloque a imagem em uma pasta que esteja no classpath de sua aplicação e aí carregue ela usando getClass().getResourceAsStream("/" + <caminhnho relativo ao classpath>)

1 curtida

Então cara, até sei que isso não se pode fazer, rs, mas coloquei pra tirar essa dúvida.
Porem, mesmo sem o caminho absoluto ele continua dando o erro.

 ImageIcon imagem = new ImageIcon(TelaPrincipal.class.getResource("logo.png"));
		Image imag = imagem.getImage().getScaledInstance(lblLogo.getWidth(), lblLogo.getHeight(), Image.SCALE_DEFAULT);
		lblLogo.setIcon(new ImageIcon(imag));

Quando faço da forma que me disse, ele pede pra tirar todo argumento do ImageIcon

		ImageIcon imagem = new ImageIcon(TelaPrincipal.class.getClass().getResourceAsStream("logo.png"));
		Image imag = imagem.getImage().getScaledInstance(lblLogo.getWidth(), lblLogo.getHeight(), Image.SCALE_DEFAULT);
		lblLogo.setIcon(new ImageIcon(imag));

Desculpe a ignorância, estou meio confuso.

// comece com '/' pra pegar a partir da raíz do classpath
String caminho = "/logo.png";
InputStream input = TelaPrincipal.class.getResourceAsStream(caminho); 
Image image = ImageIO.read(input);
ImageIcon imageIcon = new ImageIcon(image);
lblLogo.setIcon(imageIcon);

Ele me pede pra fazer um cast:

Olha teus imports, você fez o import do InputStream errado.
Tem que ser o do pacote java.io.

Solucionou essa linha, realmente tinha importado de outra classe, porem agora a linha de baixo (Image image = ImageIO.read(input); que está com erro, ele pede para declarar throws, mas mesmo declarando ele continua dando erro na execução…

Não põe throws, faz um try-catch
Qual o erro que está acontecendo?

1 curtida

Aê! Consegui mano! Foi o try-catch mesmo!
e o caminho estava errado também, faltou o ("…/").

Muito obrigado pela paciencia staroski!

Só uma ultima pergunta … Existe alguma desvantagem de fazer dessa forma ?

		JLabel lblLogo = new JLabel("");
		lblLogo.setBounds(660, 291, 200, 200);
		contentPane.add(lblLogo);
		
		ImageIcon imagem = new ImageIcon(TelaPrincipal.class.getResource("../icones/logo.png"));
		Image imag = imagem.getImage().getScaledInstance(lblLogo.getWidth(), lblLogo.getHeight(), Image.SCALE_DEFAULT);
		lblLogo.setIcon(new ImageIcon(imag));

Pois testei e também deu certo…

Sim, dessa forma, se sua imagem estiver dentro de um arquivo.jar, ela não será encontrada, pois você está informando um caminho relativo ao sistema de arquivos e não ao classpath da aplicação.

1 curtida

Beleza! Muito obrigado cara! A cada dia vamos evoluindo…