как ссылаться на файлы javafx fxml в папке ресурсов?

<p>я создаю приложение с графическим интерфейсом javafx, и мой проект настроен maven. я хочу иметь возможность ссылаться на мои файлы fxml, как это в моих контроллерах:</p><pre><code>fxmlloader.load(getclass().getresource("main.fxml"); </code></pre><p>где мой файл main.fxml находится в папке src/main/resources, а мой контроллер - в папке src/main/java. как мне это сделать? моя папка src/main/resources находится в пути сборки, и я могу вызвать файл .properties, который находится в папке src/main/resources, из класса в папке src/main/java.</p><p><strong> правка </strong></p><p>я попытался поместить файл fxml в соответствующий каталог в папке основных ресурсов:</p><p><img src="https://i.stack.imgur.com/c3rr8.png" alt="enter image description here"></p><p>но я все еще получил ошибку.</p>

<p><em>пример использования</em></p><pre><code>fxmlloader loader = new fxmlloader(); loader.setlocation(getclass().getresource("/main.fxml")); parent content = loader.load(); </code></pre><p><em>параметры разрешения местоположения</em></p><ol> <li><p>поместите все ваши fxml в каталог src/main/resources.</p> <pre><code>loader.setlocation(getclass().getresource("/main.fxml")); </code></pre></li> <li><p>поместите все ваши fxml в каталог src/main/resources/fxml. </p> <pre><code>loader.setlocation(getclass().getresource("/fxml/main.fxml")); </code></pre></li> <li><p>поместите fxml в соответствующий каталог ресурсов; например src/основные/ресурсы/ком/mycompany/myapp. </p> <pre><code>loader.setlocation(getclass().getresource("main.fxml")); </code></pre></li> </ol><p>последний вариант предполагает, что класс, из которого вы загружаете fxml, находится в том же относительном местоположении в соответствующей иерархии исходного кода java. например, вы можете вызвать последнюю команду загрузки из источника <code>com.mycompany.myapp.main.java</code>.</p><p><em>fxmlloader рекомендации по использованию</em></p><ol> <li><p>создание экземпляра fxmlloader с помощью <code>new fxmlloader()</code> вместо использования <a href="https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/fxmlloader.html#load-java.net.url-">статических методов в fxmlloader</a> . </p> <ul> <li>статические методы сбивают с толку, когда вы хотите <a href="http://docs.oracle.com/javafx/2/api/javafx/fxml/fxmlloader.html#getcontroller%28%29">получить значения</a> (например, экземпляры controllers) из загрузчика.</li> </ul></li> <li><p> <a href="https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/fxmlloader.html#setlocation-java.net.url-">установите местоположение</a> на экземпляре fxmlloader и вызовите <a href="https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/fxmlloader.html#load--"><code>load()</code></a> вместо загрузки из потока с помощью <a href="https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/fxmlloader.html#load-java.io.inputstream-"><code>load(stream)</code></a> .</p> <ul> <li>установка местоположения на основе url в загрузчике позволяет разрешать относительные ресурсы .\_\_, загруженные в файлы fxml и css. относительные ресурсы не разрешаются для потокового конструктора.</li> </ul></li> <li><p>чтобы получить местоположение на основе класса, используйте <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/class.html#getresource-java.lang.string-"><code>getclass().getresource()</code></a> , так как оно основано на url, а не <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/class.html#getresourceasstream-java.lang.string-"><code>getclass().getresourceasstream()</code></a> , которое основано на потоке.</p></li> </ol><p><em>ide и настройки сборки</em></p><p>убедитесь, что ваш ide или инструмент сборки копирует файлы fxml из каталога ресурсов в выходной каталог сборки. для понимания настроек intellij для этого см .: <a href="https://stackoverflow.com/questions/23421325/how-to-convert-a-normal-java-project-in-intellij-into-a-javafx-project">как преобразовать обычный проект java в intellij в проект javafx</a> .</p>

<p>вы используете <code>fxmlloader fxmlloader = new fxmlloader( getclass().getresource("main.fxml") );</code> для загрузки вашего main.fxml. для этого требуется main.fxml и класс java, загружающий его в тот же каталог/путь . если вы хотите загрузить файл fxml из пути/местоположения, отличного от загружающего его класса java, вам необходимо использовать относительный путь . как упомянуто выше @jewelsea, вы можете использовать относительный путь, используя/символ перед вашим main.fxml . таким образом, код, который заставит вас работать в вашем случае:</p><pre><code>fxmlloader fxmlloader = new fxmlloader( getclass().getresource("/main.fxml") ); </code></pre>

<p>откройте папку ресурсов в проводнике вашей операционной системы. здесь вы увидите, что вы создали папку «dominion.application» вместо папки «application» внутри папки «dominion». из-за этого класс «maincontroller» помещается в другой пакет, как файл fxml.</p>