Setar imagem no form (.JAR)

Boa tarde galera.

Tenho o seguinte trecho de código que verifica se salvou no banco de dados, caso sim retorna true, e em seguida habilita alguns campos do formulário e seta uma imagem no form com o sinal de positivo(ABERTO), no netbeans ele seta a imagem normalmente mas quando ou gero o .jar e copio a pasta dist para a estação de trabalho do usuário o sistema não consegue encontrar o caminho da imagem de positivo, ele faz todas as operações com o banco etc, mas ele não seta a imagem.

Se eu pegar e copiar a pasta do projeto inteiro pra estação do cliente funciona, mas eu não queria mandar a pasta inteira pois nela tem o código fonte, gostaria de mandar apenas o conteúdo da pasta dist pra estação.

OBS: A mesma coisa acontece quando tento abrir um relatorio.jasper executando o sistema pelo .JAR, ele não encontra o caminho do jasper, cliquei em abrir-com winrar no meu .JAR e todas as pastas estão lá, pasta com os relatórios, a pasta com as imagens.

boolean save = controlEntrada.entradaEPI(mod);
            if (save == true) {
                cxtId.setText(String.valueOf(controlEntrada.retornaUltimaEntrada(mod)));
                habilitaCamposLancamento();
                imageStatus.setIcon(new javax.swing.ImageIcon("..\\src\\images\\positivo.png"));
            }

O problema é que você está carregando a imagem do sistema de arquivos. Assim quando você muda o seu jar de pasta, ele não consegue encontrar a imagem.

Nesses casos o ideal é que você carregue a imagem como um recurso da aplicação, assim a imagem estará dentro do jar e sempre disponível independente de onde a aplicação rodar.

1 curtida

Entendi, os exemplos que tem nessa documentação está complicado de entender.

Bom, pra resumir, você acessa os recursos usando uma classe chamada ClassLoader, pra conseguir um basta usar o Class do objeto que vc está trabalhando. No seu caso, pra conseguir carregar a imagem você mudaria essa linha:

imageStatus.setIcon(new javax.swing.ImageIcon("..\\src\\images\\positivo.png"));

por isso:

imageStatus.setIcon(new javax.swing.ImageIcon(this.getClass().getClassLoader().getResource("/images/positivo.png")); // por padrão, a pasta "src"é a pasta raiz dos resources

Faz um teste e diz se funciona.

1 curtida

Certinho amigo muito obrigado resolveu meu problema.

imageStatus.setIcon(new ImageIcon(getClass().getResource("/images/positivo.png")));

agora como funcionária com os .jasper?

String jasperPrint = JasperFillManager.fillReportToFile("../src/rel/relEstoque.jasper", parameters, jrRS);

Fiz dessa forma

String caminho=getClass().getResource("/rel/relEstoque.jasper").toString();
            String jasperPrint = JasperFillManager.fillReportToFile(caminho, parameters, jrRS);

deu o seguinte erro: Erro: net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: file:\C:\Users\informatica01.COOPER\Desktop\SisEPI\build\classes\rel\relEstoque.jasper

Nesse caso não vai funcionar, pq os resources não são acessíveis diretamente pelo caminho do arquivo.
Isso funcionou no ImageIcon pq ela consegue carregar o icone através da URL que é o objeto retornado pelo método getResource. Mas nesse caso é preciso achar na documentação outra forma de carregar o relatório.

Uma opção é usar a função fillReport, que aceita um Stream e não um caminho de arquivo, e carregar o resource como um Stream:

InputStream resource=getClass().getResourceAsStream("/rel/relEstoque.jasper");
JasperPrint jasperPrint = JasperFillManager.fillReport(resource, parameters, jrRS);
2 curtidas

image

Se olhar a documentação da classe JasperViewer, vai perceber que não há nenhum construtor que receba como parâmetro um JasperPrint e dois boolean.

1 curtida

Entendi cara, quando eu passava aquela string que está comentada pro jasperPrint funcionava mas dava pal quando rodava o programa pelo .JAR.