Я могу сказать вам, что работает для меня.Во-первых, файлы FXML следует рассматривать как ресурсы, а не как исходные файлы Java, поэтому их лучше размещать в своем собственном дереве каталогов.Ваш исходный код в настоящее время находится в дереве /src/main/java
, поэтому ваши файлы FXML должны быть перемещены в дерево /src/main/resources
, в идеале в подкаталог с именем fxml
.(У меня также есть подкаталог с именем i18n
, в котором содержатся пакеты ресурсов для определения текстовых меток на нескольких языках.)
Как только ваши файлы FXML будут найдены по пути /src/main/resources/fxml
, вы сможете загрузить их изваши контроллеры JavaFX примерно так:
FXMLLoader loader = new FXMLLoader();
URL fxmlLocation = getClass().getResource("/fxml/main_screen.fxml");
loader.setLocation(fxmlLocation);
loader.setController(mainScreenController);
loader.setResources(ResourceBundle.getBundle("i18n/Text", new Locale("sv", "SE")));
Pane pane = loader.<Pane>load();
Scene scene = new Scene(pane);
(Если корневой элемент вашего файла FXML не представляет Pane
, вам нужно изменить строку, которая вызывает метод load()
,и замените Pane
на соответствующий тип.)
Обратите внимание, что вызов getResource(String)
принимает путь, который начинается с косой черты и представляет корень пути ресурса /src/main/resources/
.
И также обратите внимание, что, как ни странно, вызов getBundle(String)
действительно , а не начинается с косой черты, даже если вы нацелены на точно такой же путь /src/main/resources/
.Я должен признать, что не могу объяснить, почему эти два метода нужно обрабатывать немного по-разному, как этот, но этот код работает для загрузки как файла "main_screen.fxml", так и файла пакета ресурсов шведского языка "Text_sv_SE.properties".