Подтвердить что ты не робот

Местоположение JavaFX не установлено сообщение об ошибке

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

  • Щелкните правой кнопкой мыши → "Очистить и построить"
  • Запустить проект еще раз

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

Ответ 3

Я преобразовал простое приложение 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. Программа работала должным образом.

Ответ 4

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

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

Ответ 5

Я попробовал быстро и просто:

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

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

Возможно, 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();      
}

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

Ответ 10

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

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

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

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

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

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

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();

Ответ 15

Я наткнулся на ту же проблему. Программа отлично работала от 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;
        }
}

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

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

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

Ответ 16

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

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

x.y.z

вместо

х/у/г

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

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

Ответ 17

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

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

Ответ 18

В моем случае причиной ошибки была ошибка времени выполнения в моем соответствующем Java-классе. Я исправил это, и все было хорошо. Мой совет: не ищите "местоположение не установлено"