[RESOLVIDO] Estrutura dos diretórios incorreta?

Olá a todos.

No IntelliJ, essa é minha estrutura de diretórios. Todavia, enquanto o FXML é identificado perfeitamente, a imagem não. Por que isso ocorre? É o jeito que estou pegando a imagem?

Exception:

Exception in Application start method
Exception in thread “main” java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1118)
at javafx.scene.image.Image.(Image.java:620)
at br.com.fearchannel.complexcalc.Calculadora.start(Calculadora.java:18)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
… 1 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1110)
… 11 more

Acredito que falta vc configurar o Working Directory. Por padrão ele aponta pro root do projeto e é a partir dali que ele busca o arquivo.

Na barra de menu, vai em Run e clica em Run… e depois em Edit configuration. Na tela de configuração vai ter a opção Working directory. Ali vc coloca o lugar onde estão suas imagens (src/main.java/resources…).

Interessante. Creio que não seja sobre isso, ainda. Veja bem, dentro de resources (onde o intellij aconselha que todo recurso seja mantido), ele captura a pasta fxmls e (aparentemente) não a imgs. Creio que o working directory estar na raiz do projeto é o correto.

[]'s

1 curtida

Estranho esse erro!

Eu sempre utilizei de forma diferente, veja se funciona pra você!

URL url = this.getClass().getClassLoader().getResource("imgs/icon.png");
Image image = Toolkit.getDefaultToolkit().getImage(url);
primaryStage.getIcons().add(image);
1 curtida

Estranho, de fato. Utilizo dessa mesma forma (e praticamente com a mesma estrutura de diretórios!) em outro projeto, e funciona perfeitamente. Daí, concluí que a falha não estaria no código (que deveria funcionar normalmente), e sim em algum detalhe do IntelliJ. Mas como ele consegue pegar o FXML, estranhei.

Creio que isso sirva para o Swing (no pacote awt), mas não funciona com JavaFX. Mas obrigado pela sugestão, vou tentar outros meios para isso.

[]'s

1 curtida

Tenta um @ antes da url

"@/imgs/icon.png"

Nem assim, @Mike. Impossível isso! rs.

Tentei também tirar a barra, usar “file:name.png”. Sem resultados. Engraçado que a própria IDE reconhece e linka o arquivo (segurando ctrl + clicando ele abre a imagem), mas o software não. De outras formas, a IDE não linka.

[]'s

Vish, tenta dessas duas formas:

Image image = new Image(getClass().getResource("/imgs/icon.png").toExternalForm());

Image image = new Image(getClass().getResource("/imgs/icon.png"));
2 curtidas

Maravilhosa resposta, Mike. A primeira forma resolveu. Acho que é o getResource() que faltava.

1 curtida