Caminho "genérico" para imagem[Resolvido]

Olá pessoal, tudo bem?
Eu tenho um JFrame com uma imagem de fundo(background), que funciona corretamente, mas eu gostaria de saber se é possível passar um caminho “genérico” para imagem…
Tipo no lugar disso…

...("C:/Users/Desktop/Development/Documento/exemplo.jpg");

Mais ou menos isso…

...(funçãoPegaCaminho("exemplo.jpg"));

Estou usando a classe abaixo:

jPanelWithBackground1 = new fechamento.zfsd.JPanelWithBackground("C:/Users/Desktop/Development/Documento/exemplo1.jpg");
//Código personalizado no JFrame
/*..........................................................''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*/

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class JPanelWithBackground extends JPanel{

   private String pathImage = ""; // variável que vai receber o caminho da imagem

   public JPanelWithBackground() {
   }

   public JPanelWithBackground(String pathImage) {
       this.pathImage = pathImage;
   }

   @Override
   public void paintComponent(Graphics g) {

       Graphics2D gr = ( Graphics2D )g.create();

       try {

          BufferedImage buffer = ImageIO.read( new File(pathImage) );
          gr.drawImage(buffer, null, 0, 0 ); // desenha a imagem

       } 
       catch (IOException ex) {
          Logger.getLogger(JPanelWithBackground.class.getName()).log(Level.SEVERE, null, ex);
       }

   }
}

Veja se isso te ajuda. http://docs.oracle.com/javase/tutorial/uiswing/components/filechooser.html

Caso seja uma imagem “fixa”, podes usar para carregar do seu JAR ou pegar de um caminho relativo.
Algo com “/images/image.jpg”, por exemplo. Para pegar o início do path, ai tu verifica se está no seu jar, classpath e etc.

Abraços.

Obrigado, vou dar uma olhada nisso.

Seja a imagem estiver no mesmo pacote do seu codigo.
é só usar a nome da imagem
(funçãoPegaCaminho(“exemplo.jpg”));

porém se estiver em outra vc deverá fazer mais ou menos istó

(funçãoPegaCaminho("/exemplo.jpg"));

(funçãoPegaCaminho(“pacote/exemplo.jpg”));

(funçãoPegaCaminho("/pacote/exemplo.jpg"));

(funçãoPegaCaminho(“pacote/pacote/exemplo.jpg”));

(funçãoPegaCaminho("/pacote/pacote/exemplo.jpg"));

algum destes exemplos vai funcionar.

Eu dei uma pesquisada e encontrei algo que acredito que vá me ajudar…

public String CaminhoJar(String nomeimg){
        String caminhoJar = System.getProperty("java.class.path");
        String path="";
        try {
            ZipFile zipFile = new ZipFile(caminhoJar);
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry zipEntry = (ZipEntry) entries.nextElement();
                String pathJar = zipEntry.getName();
                if (!zipEntry.isDirectory() && pathJar.contains(nomeimg)) {
                    InputStream is = ClassLoader.getSystemResourceAsStream(pathJar);
                    path=is.toString();
                }
            }
        }catch(Exception e){
            JOptionPane.showMessageDialog(this, "Erro ao Carregar a Imagem \n" + e);
        }
        return path;
    }

Talvez seja isso que o nel me indicou… :?
Mas está dando esse erro aqui:

java.util.zip.ZipException: zip file name too long

Eu estou chamando a função CaminhoJar assim no meu JFrame:

jPanelWithBackground1 = new fechamento.zfsd.JPanelWithBackground(CaminhoJar("ZFLenksysteme"));

Alguém sabe como resolver isso?

xandelol porque está descompactando seu JAR e varrendo o mesmo a procura da imagem ?
Esse JAR não é gerado por você, ou seja, é externo ?

Porque se é algo gerado por você, o que eu tinha em mente é o uso do método getResourceAsStream, da classe Class.
O que não falta são exemplos na net sobre o uso desse método. Dessa forma, com uma classe dentro do JAR, é relativamente simples encontrar a imagem e carregar a mesma.

Sobre a sua exceção, teria como posta-la por completo e indicar onde ela acusa a exceção?

Valeu nel vou dar uma olhada no [color=blue]getResourceAsStream[/color].
Sobre a exceção, é essa aqui:

Exception in thread "main" java.lang.RuntimeException: java.util.zip.ZipException: zip file name too long at fechamento.zfsd.Menu.CaminhoJar(Menu.java:665) at fechamento.zfsd.Menu.initComponents(Menu.java:61) at fechamento.zfsd.Menu.<init>(Menu.java:32) at fechamento.zfsd.FechamentoZFSD.main(FechamentoZFSD.java:11) Caused by: java.util.zip.ZipException: zip file name too long at java.util.zip.ZipFile.open(Native Method) at java.util.zip.ZipFile.<init>(ZipFile.java:114) at java.util.zip.ZipFile.<init>(ZipFile.java:75) at fechamento.zfsd.Menu.CaminhoJar(Menu.java:654) ... 3 more Java Result: 1 A linha que a exceção indica é essa:

jPanelWithBackground1 = new fechamento.zfsd.JPanelWithBackground(CaminhoJar("ZFLenksysteme"));

Qual nome do seu JAR ?
E xandelol, é contra os padrões Java denominar um método que inicie com letra maiúscula, ok?

Abraços.

O nome do meu JAR é esse [color=orange]Fechamento_ZFSD[/color].

Tenta remover esse “_” (underline) do nome e fazer ele um pouco menor, a nível de curiosidade.
E quais são estas duas linhas em seu código:

[b]at fechamento.zfsd.Menu.CaminhoJar(Menu.java:665)

at fechamento.zfsd.Menu.CaminhoJar(Menu.java:654) [/b]

Vou tentar…
Essas linhas são o meu [color=blue]try[/color] e [color=blue]catch[/color] do meu caminhoJar

[quote=xandelol]Vou tentar…
Essas linhas são o meu [color=blue]try[/color] e [color=blue]catch[/color] do meu caminhoJar[/quote]

Ok.

Não colega, me refiro tu postar essas linhas de código. São essenciais para identificar exatamente a linha em que o erro ocorre.
Eu acredito que seja algo relacionado ao nome do seu JAR, como a própria exceção indica. Por isso, saber exatamente as linhas que ele aponta no código é importante.

O try-catch nada mais é que um possível tratamento a uma exceção, ok?:slight_smile:

Então nel eu mudei o nome do meu JAR(ficou “fechazf”), mas não teve efeito, continua dando o mesmo erro.

Então [b]nel[/b] eu mudei o nome do meu JAR(ficou "fechazf"), mas não teve efeito, continua dando o mesmo erro. //Deu um erro e duplicou a mensagem!

Depois de um tempo achei a solução para o meu problema…
Usei esse código para pegar o path do meu arguivo.

String fileimgpath = new File("build/classes/zfschließung/ZFLenksysteme.jpg").getCanonicalPath();

Agora eu tenho um outro problema :frowning:
No Netbeans o código que eu usei acima funciona perfeitamente, mas no .jar, ele não funciona.
Alguém pode me ajudar?

Já consegui resolver!!!
Era só colar a pasta src na pasta dist do .jar. :smiley: