Это всего лишь два возможных способа объявления функций, а во втором - использование функции перед объявлением.
Это случилось со мной, и я нашел решение. Если вы создаете проект с вашими файлами .fxml в разных пакетах из класса, в котором есть строка запуска (Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));
), и используйте относительный путь к вашим окнам, за исключением первого, который не запускается, когда вы запускаете банку. Чтобы сохранить его в небольшом месте .fxml-файл в том же пакете с классом, который запускает его, и задайте путь, подобный этому («filenamehere.fxml»), и он должен работать нормально.
Я получил это исключение, и найденное мной решение было через Netbeans IDE, просто:
Я не знаю ПОЧЕМУ это сработало, но это было!
Project -> Clean...
, и он работал, когда я нажал кнопку run.
– Water
12 April 2015 в 01:30
Я наткнулся на ту же проблему. Программа отлично работала от 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]
Я преобразовал простое приложение 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. Программа работает как ожидалось.
getClassLoader()
, важно указать корневую косую черту на пути, как FXMLLoader(App.class.getResource("/fxml/ObjOverview.fxml"));
– Zavael
6 August 2015 в 12:47
resources/fxml/ObjOverview.fxml
– Bolic
26 December 2015 в 12:51
resources
должна находиться внутри папки src
? Вы знаете, должно ли это работать в Eclipse?
– leandrocoutom
14 July 2018 в 22:44
У меня была та же проблема. Это простая проблема, заключающаяся в том, что вы не указали правильный путь.
Щелкните правой кнопкой мыши по файлу .fxml
и выберите свойства (для тех, кто использует eclipse, не будет сильно отличаться для другой IDE), а затем скопируйте скопируйте местоположение, начиная с /packagename
до конца, и это должно решить проблему
Для пользователей Intellij моя проблема заключалась в том, что каталог, в котором были мои файлы fxml (src / main / resources), не был помечен как каталог «Ресурсы».
Откройте настройки модуля / проекта, перейдите на вкладку источников и убедитесь, что Intellij знает, что каталог содержит файлы ресурсов проекта.
У меня была та же проблема.
через несколько минут, я подумал, что я пытался загрузить файл.fxml из неправильного местоположения.
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
Я знаю, что это поздний ответ, но я надеюсь помочь любому, у кого есть эта проблема. Я получал ту же ошибку и обнаружил, что мне пришлось вставить /
перед моим файловым путем. Тогда исправленный вызов функции будет следующим:
FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
// ^
У меня была эта проблема и я нашел этот пост. Моя проблема была просто проблемой с именем файла.
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"));
Я попробовал быструю и простую вещь:
У меня есть два пакета -> app.gui
и app.login
. В моем классе входа я использую mainview.fxml
из app.gui
, поэтому я сделал это в login.fxml
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));
И он работает:)
..
не будет разрешать их, поскольку протокол jar:
не поддерживает локальный каталог каталогов ..
.
– jewelsea
13 January 2016 в 00:32
Ответ, приведенный CsPeitch и другими, находится на правильном пути. Просто убедитесь, что файл fxml копируется в целевую точку вывода класса, или среда выполнения не увидит его. Проверьте созданный каталог файлов классов и посмотрите, есть ли файл fxml
Я думаю, что проблема - это либо неправильное имя макета, либо недопустимый путь к файлу макета.
для IntelliJ, вы можете создать каталог ресурсов и разместить там файлы макета.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
моя была странной ... Специфическая особенность IntelliJ.
Я посмотрел на мои выходные классы и была папка:
xyz
вместо
x / y / z
, но если у вас есть определенные параметры, установленные в IntelliJ, в навигаторе они будут выглядеть как xyz
, поэтому проверьте свою выходную папку, если вы царапаете свою голову
Location not set
выигрывает мой голос за самые бесполезные описания исключений. Я думаю, разработчики JavaFX никогда не слышали о %s
?
– ycomp
18 March 2017 в 04:14
Я имею в виду что-то вроде этого:
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();
}
Попробуйте и дайте мне знать, пожалуйста.
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml"));
в моем случае я просто удаляю ..
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));