как загрузить файл fxml с помощью FXMLLoader [duplicate]

Добавить комментарии между элементами, чтобы НЕ иметь пробел. Для меня это проще, чем сбросить размер шрифта до нуля и затем установить его обратно.

<div>
    Element 1
</div><!--
--><div>
    Element 2
</div>
41
задан 21 June 2013 в 06:49
поделиться

17 ответов

Это случилось со мной, и я нашел решение. Если вы создаете проект с вашими файлами .fxml в разных пакетах из класса, в котором есть строка запуска (Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));), и используйте относительный путь к вашим окнам, за исключением первого, который не запускается, когда вы запускаете банку. Чтобы сохранить его в небольшом месте .fxml-файл в том же пакете с классом, который запускает его, и задайте путь, подобный этому («filenamehere.fxml»), и он должен работать нормально.

0
ответ дан CsPeitch 3 September 2018 в 17:11
поделиться

Это часто не приводит к правильному пути к местоположению. Важно понимать, что путь начинается с текущего пакета, в котором находится код, а не от корня проекта. До тех пор, пока вы получите правильный относительный путь, вы должны быть в состоянии избежать этой ошибки в этом случае.

3
ответ дан demongolem 3 September 2018 в 17:11
поделиться

Я получил это исключение, и найденное мной решение было через Netbeans IDE, просто:

  1. Щелкните правой кнопкой мыши -> «Очистить и построить»
  2. Запустить project again

Я не знаю ПОЧЕМУ это сработало, но это было!

21
ответ дан Dimitris 3 September 2018 в 17:11
поделиться

Я наткнулся на ту же проблему. Программа отлично работала от Eclipse с помощью кнопки «Запустить», но не из запускаемого JAR, который я ранее экспортировал. Мое решение было:

1) Переместить основной класс в пакет по умолчанию

2) Установить другой путь для Eclipse и другие во время работы из файла JAR (вставить это в Main.java)

public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
    File x = getCurrentJarFileLocation();
    if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
        return false;
    } else {
        return true;
    }
}
public static File getCurrentJarFileLocation() {
        try {
            return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        } catch(URISyntaxException e){
            e.printStackTrace();
            return null;
        }
}

И после этого в методе начала вам необходимо загрузить такие файлы:

FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));

Это работает для меня на Eclipse Mars с e (fx) клише. / g4]

0
ответ дан DominikStyp 3 September 2018 в 17:11
поделиться

Я преобразовал простое приложение NetBeans 8 Java FXML в управляемый Maven. Тогда у меня возникли проблемы, потому что методы getResource() не смогли найти файлы .fxml. В моем первоначальном приложении fxmls были разбросаны по дереву пакетов - каждый рядом с файлом класса контроллера. После того, как я сделал Clean и построил в NetBeans, я проверил результат .jar в целевой папке - .jar вообще не содержал никакого fxml. Все fxmls были странно исчезли.

Затем я поместил все fxmls в папку resources / fxml и соответственно установил параметры метода getResource, например: FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml"));. В этом случае все прошло нормально. Папка fxml появилась внутри корня .jar и содержала все мои fxmls. Программа работает как ожидалось.

15
ответ дан Evaldas Ilginis 3 September 2018 в 17:11
поделиться

У меня была та же проблема. Это простая проблема, заключающаяся в том, что вы не указали правильный путь.

Щелкните правой кнопкой мыши по файлу .fxml и выберите свойства (для тех, кто использует eclipse, не будет сильно отличаться для другой IDE), а затем скопируйте скопируйте местоположение, начиная с /packagename до конца, и это должно решить проблему

0
ответ дан HDJEMAI 3 September 2018 в 17:11
поделиться

Для пользователей Intellij моя проблема заключалась в том, что каталог, в котором были мои файлы fxml (src / main / resources), не был помечен как каталог «Ресурсы».

Откройте настройки модуля / проекта, перейдите на вкладку источников и убедитесь, что Intellij знает, что каталог содержит файлы ресурсов проекта.

0
ответ дан kingdonnaz 3 September 2018 в 17:11
поделиться

У меня была та же проблема.

через несколько минут, я подумал, что я пытался загрузить файл.fxml из неправильного местоположения.

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
0
ответ дан Mohammad Hassany 3 September 2018 в 17:11
поделиться

Я знаю, что это поздний ответ, но я надеюсь помочь любому, у кого есть эта проблема. Я получал ту же ошибку и обнаружил, что мне пришлось вставить / перед моим файловым путем. Тогда исправленный вызов функции будет следующим:

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^
9
ответ дан Rane1011 3 September 2018 в 17:11
поделиться

У меня была эта проблема и я нашел этот пост. Моя проблема была просто проблемой с именем файла.

FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));

Parent root = (Parent) loader.load();

У меня есть xml, из которого все это происходит, и я убедился, что мой класс такой же, как файл fxml, меньше словаря.

Я испортил подстроку, поэтому путь был неправильным ... достаточно уверен, после того как я исправил имя файла, с которым он работал.

Короче говоря, я думаю, что Проблема в том, что имя файла названо неправильно или путь неправильный.

ДОПОЛНЕНИЕ: С тех пор я перешел в проект Maven. Способ не Maven заключается в том, чтобы иметь все внутри вашего пути к проекту. Способ Maven, который был указан в нижеприведенном ответе, был немного разочаровывающим с самого начала, но я внес изменения в свой код следующим образом:

FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
38
ответ дан ryan.s 3 September 2018 в 17:11
поделиться

У меня была такая же проблема в моем приложении JavaFX. Еще более странно: в моей среде разработки Windows все отлично работало с загрузчиком fxml. Но когда я выполнил тот же самый код на моей машине Debian, у меня были аналогичные ошибки с «location not set».

Здесь я прочитал все ответы, но ни один из них, похоже, действительно «не разрешил» проблему. Мое решение было легким, и я надеюсь, что это поможет некоторым из вас:

Возможно, Java запутается методом getClass (). Если что-то работает в разных потоках или ваш класс реализует какие-либо интерфейсы, он может прийти к выводу, что метод getClass () возвращает другой класс, чем ваш. В этом случае ваш относительный путь к creatProduct.fxml будет неправильным, потому что ваши «находятся» не в том пути, который, по вашему мнению, вы ...

Итак, чтобы быть на стороне сохранения: будьте более конкретными и попробуйте использовать статическое поле класса в своем классе ( Обратите внимание на ваш классClassHere.class ).

@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
   Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(YourClassHere.class.getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}

Поняв это, я ВСЕГДА сделаю это так. Надеюсь, что это поможет!

2
ответ дан Sauer 3 September 2018 в 17:11
поделиться

Я попробовал быструю и простую вещь:

У меня есть два пакета -> app.gui и app.login

. В моем классе входа я использую mainview.fxml из app.gui, поэтому я сделал это в login.fxml

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));

И он работает:)

4
ответ дан svarog 3 September 2018 в 17:11
поделиться

Ответ, приведенный CsPeitch и другими, находится на правильном пути. Просто убедитесь, что файл fxml копируется в целевую точку вывода класса, или среда выполнения не увидит его. Проверьте созданный каталог файлов классов и посмотрите, есть ли файл fxml

1
ответ дан Victor Grazi 3 September 2018 в 17:11
поделиться

Я думаю, что проблема - это либо неправильное имя макета, либо недопустимый путь к файлу макета.

для IntelliJ, вы можете создать каталог ресурсов и разместить там файлы макета.

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
3
ответ дан WMG 3 September 2018 в 17:11
поделиться

моя была странной ... Специфическая особенность IntelliJ.

Я посмотрел на мои выходные классы и была папка:

xyz

вместо

x / y / z

, но если у вас есть определенные параметры, установленные в IntelliJ, в навигаторе они будут выглядеть как xyz

, поэтому проверьте свою выходную папку, если вы царапаете свою голову

0
ответ дан ycomp 3 September 2018 в 17:11
поделиться

Я имею в виду что-то вроде этого:

FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null;

public void start(Stage primaryStage) throws Exception {
  primaryStage.setTitle("Shop Management");
  myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));
  Pane myPane = (Pane) myLoader.load();
  CartHomePageUI controller = (CartHomePageUI) myLoader.getController();
  controller.setPrevStage(primaryStage);
  myScene = new Scene(myPane);
  primaryStage.setScene(myScene);
  primaryStage.show();
}

После этого

public void setPrevStage(Stage stage){
    this.prevStage = stage;
}

public void gotoCreateCategory(ActionEvent event) throws IOException {
    Stage stage = new Stage();
    stage.setTitle("Shop Management");
    myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null   put a breakpoint after this to confirm it
    setPrevStage(stage);
    stage.show();       
}

//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
    Stage stage = new Stage();
    stage.setTitle("Shop Management");
    myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null put a breakpoint after this to confirm it
    setPrevStage(stage);
    stage.show();      
}

Попробуйте и дайте мне знать, пожалуйста.

1
ответ дан Zoe 3 September 2018 в 17:11
поделиться
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

в моем случае я просто удаляю ..

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 
0
ответ дан ZURA Tikaradze 3 September 2018 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: