it-swarm.com.ru

JavaFX Location не установлено сообщение об ошибке

У меня проблема при попытке закрыть текущую сцену и открыть другую сцену, когда выбрано menuItem. Моя основная сцена закодирована так:

public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));

    Pane myPane = (Pane) myLoader.load();

    CartHomePageUI controller = (CartHomePageUI) myLoader.getController();

    controller.setPrevStage(primaryStage);
    Scene myScene = new Scene(myPane);
    primaryStage.setScene(myScene);
    primaryStage.show();
}

Когда программа будет выполнена, она перейдет в cartHomePage.fxml. Оттуда я могу выбрать, чтобы создать продукт или создать категорию, когда выбран пункт меню. Вот мое мероприятие:

Stage prevStage;

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

 public void gotoCreateCategory(ActionEvent event) throws IOException {
  Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    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");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}

Однако я могу переключить сцену только один раз. Например, моей страницей по умолчанию является cartHomePage.fxml. Когда я запускаю программу, сначала я иду на этап создания продукта. После этого я больше не могу никуда идти. Сообщение об ошибке:

Java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception

Я установил сцену после того, как закрыл и разошелся. Интересно, какая часть пошла не так.

Заранее спасибо.

48
user2424370

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

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

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

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

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

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

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

FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));
42
ryan.s

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

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

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

23
Dimitris

Я преобразовал простое приложение Java FXML для NetBeans 8 в приложение, управляемое 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

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

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^
11
Rane1011

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

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

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

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

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

4
kaya

Я думаю, что проблема либо в неверном имени макета, либо в неверном пути файла макета. 

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

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
3
WMG

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

3
demongolem

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

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

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

Итак, чтобы быть на стороне сохранения: будьте более конкретны и попробуйте используйте поле статического класса в вашем классе (Обратите внимание на YourClassHere.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
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

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

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 
2
ZURA Tikaradze

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

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

1
kingdonnaz

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

1
Victor Grazi

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

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
Lionnel Afangbedjee

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

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

x.y.z

вместо 

х/у/г

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

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

0
ycomp

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

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

0
Hayxe

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

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

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;
        }
}

И после этого в start method вы должны загрузить такие файлы:

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

Это работает для меня в Eclipse Mars с e (fx) clipse плагин.

0
DominikStyp

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

через несколько минут я понял, что пытаюсь загрузить файл file.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

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

0
CsPeitch