Jak odwołać się do plików javafx fxml w folderze zasobów?
Tworzę aplikację javafx GUI i mój projekt jest projektem skonfigurowanym przez Mavena. Chcę móc odwoływać się do moich plików fxml w ten sposób w moich kontrolerach:
FXMLLoader.load(getClass().getResource("main.fxml");
Gdzie moja główna.plik fxml znajduje się w folderze src/main/resources, a mój kontroler znajduje się w folderze src/main/java. Jak mam to zrobić? Mój folder src / main / resources znajduje się w ścieżce budowania i jestem w stanie wywołać .Plik Właściwości, który znajduje się w folderze src/main/resources z klasy w katalog src / main / java.
Edit
Próbowałem umieścić plik fxml w odpowiednim katalogu głównego katalogu zasobów:
Ale nadal mam błąd.3 answers
przykład użycia
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
Opcje rozdzielczości lokalizacji
-
Umieść cały swój fxml w katalogu src/main / resources.
loader.setLocation(getClass().getResource("/main.fxml"));
-
Umieść cały swój fxml w katalogu src/main/resources / fxml.
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
-
Umieść fxml w odpowiednim katalogu zasobów; np. src/main/resources/com/mycompany / myapp.
loader.setLocation(getClass().getResource("main.fxml"));
Ostatnia opcja zakłada, że klasa, z której jesteś Ładowanie fxml znajduje się w tej samej względnej lokalizacji w odpowiedniej hierarchii źródeł Javy. Na przykład, możesz wywołać ostatnią komendę load ze źródła com.mycompany.myapp.Main.java
.
fxmlloader usage recommendations
-
Tworzy instancję FXMLLoader przez
new FXMLLoader()
zamiast używać metody statyczne na FXMLLoader .- metody statyczne staje się mylące, gdy chcesz uzyskać wartości (jak instantiated Kontrolery) z ładowacz.
-
Ustaw lokalizację na uruchomionym Fxmlloaderze i wywołaj
load()
zamiast ładowania ze strumienia za pomocąload(stream)
.- ustawienie adresu URL w loaderze pozwala na rozdzielczość względne zasoby ładowane w plikach fxml i css. Względny zasoby nie są rozwiązywane dla konstruktora opartego na strumieniu.
Aby uzyskać lokalizację opartą na klasie, użyj
getClass().getResource()
, Jak to jest Oparte na URL, a niegetClass().getResourceAsStream()
który jest oparty na strumieniu.
IDE I Build Settings
Upewnij się, że Twoje narzędzie IDE lub build kopiuje pliki fxml z katalogu zasobów do katalogu wyjściowego build. Aby zrozumieć ustawienia Intellij, zobacz: jak przekonwertować normalny projekt java w intellij do projektu JavaFx.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:43
Używasz FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );
, aby załadować swój główny.fxml. To wymaga głównego.fxml i klasa java ładują go w tym samym katalogu/ścieżce.
Jeśli chcesz załadować plik fxml ze ścieżki / lokalizacji innej niż ładująca go Klasa java, musisz użyć ścieżki względnej.
Jak @jewelsea wspomniano powyżej, możesz użyć ścieżki względnej używając / character przed głównym.fxml.
Więc kod, który sprawi, że będzie działać dla Ciebie w Twoim przypadku to
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-27 05:37:47
Otwórz folder zasobów w Eksploratorze plików systemu operacyjnego. Tutaj zobaczysz, że stworzyłeś " Dominium.folder aplikacji zamiast folderu aplikacji wewnątrz folderu dominion. Z tego powodu Klasa "MainController" jest umieszczana w innym pakiecie jako plik fxml.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-19 09:59:11