um avanço mas tenho uma pergunto de onde ele tirou tanto numero depois do 2? ksksksksk
pelo menos não aparece mais null
Isso é automático to tempFile. Ao criar um tempFIle, ele é criado na pasta temp do usuário do sistema operacional. Esse numero garante que não haverá outro arquivo com o mesmo nome e evita erros.
Agora esse erro deve ser por conta dessa parte:
b = stream2file(this.a).getPath();
System.out.println(stream2file(this.a).getPath());
URL url2 = new URL(b);
Em vez disso, faça assim:
File file = stream2file(this.a);
this.fileUrl = file.toURI().toURL();
Uma pergunta esse problema de ele não achar coisas que esta dentro do pacote també serve para imagens?
Sim, mas somente quando é executado através do JAR. Por isso é melhor usar getResourceAsStream
em vez de getResource
.
nossa kskskkssk vai demorar mais do que eu imaginava ksksk mas ok obrigado
E esse é o topico mais longo que eu ja vi skskksksks
mas do jeito que seu código está, já está quase pronto. Acredito que vá funcionar depois que vc fizer o ajuste que passei.
Alguem sabe como faz isso com imagem?
Mesma coisa, sempre que for ler um recurso de dentro do JAR, utilize o getResourceAsStream
.
Faça como o @staroski disse, e depois de obter o InputStream
, vc deve converter para um array de bytes (byte[]
), assim: https://www.baeldung.com/convert-input-stream-to-array-of-bytes (várias formas de fazer isso nesse link)
obrigado
Eu fiz uns testes e como que eu vou conseguir conerter um inputStream para bytes[] com isso:
public void givenUsingPlainJava_whenConvertingAnInputStreamToAByteArray_thenCorrect() throws
IOException {
InputStream initialStream = new ByteArrayInputStream(new byte[] { 0, 1, 2 });
byte[] targetArray = new byte[initialStream.available()];
initialStream.read(targetArray);
}
e também ja tentei converter em byte[] de outras formas mas não funcionou,
ja tentei converter em url também mas aconteceu alguma coisa que na hora do IOutilitys.copy(in, out);
ele recebia null.
Eu costumo fazer com o método readBytes
abaixo:
public byte[] readBytes(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
copy(input, output);
return output.toByteArray();
}
public void copy(InputStream source, OutputStream target) throws IOException {
byte[] buffer = new byte[8192];
for (int read = -1; (read = source.read(buffer)) != -1; target.write(buffer, 0, read)) { /* corpo deste for é vazio mesmo */ }
target.flush();
}
Então eu estou com o mesmo problema do som mas agora é com imagem, parece que é so fazer igual ao solção do som mas não é parece ser bem mais complicado pois quando eu compilo tento abrir o jar mostra o erro NullPointerException, e nesse caso o problema foi esse:
Exception in thread “main” java.lang.NullPointerException
at PacoteJogo.ImageLoader.copy(ImageLoader.java:114)
at PacoteJogo.ImageLoader.readBytes(ImageLoader.java:108)
at PacoteJogo.Jogo.Tela(Jogo.java:122)
at PacoteJogo.Main.main(Main.java:26)
de varios problemas com NullPointerException:
O InputStream
que você está passando pro readBytes
está null
.
Posta seu fonte.
InputStream inp2 = this.getClass().getResourceAsStream("../Sprites/Botão.png");
byte[] readBytes1 = imageLoader.readBytes(inp2);//Note que o readBytes está dentro da classe ImageLoader
ImageIcon bb2Im = new ImageIcon(readBytes1);
JButton bb2 = new JButton(bb2Im);
Esse caminho está errado.
-
Coloca o ser arquivo em uma pasta (ou pacote) que faça parte do classpath de sua aplicação.
-
Assegure que esta pasta e arquivos estão dentro do JAR. (Qualquer coisa, posta como está a estrutura dentro do seu JAR)
-
Não utilize
..
no caminho, comece o caminho com/
para procurar a partir da raíz do classpath.