Местоположение 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
Я сделал сцену после того, как закрою ее и передаю. Интересно, какая часть пошла не так.
Спасибо заранее.
Ответы
Ответ 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-классе. Я исправил это, и все было хорошо.
Мой совет: не ищите "местоположение не установлено"