Проблемы с Javafx / XML Error [duplicate]

Это всего лишь два возможных способа объявления функций, а во втором - использование функции перед объявлением.

41
задан 21 June 2013 в 06:49
поделиться

17 ответов

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

0
ответ дан CsPeitch 21 August 2018 в 05:46
поделиться
  • 1
    У меня такая же проблема, и это ее не решает – Victor Grazi 14 August 2015 в 20:21
  • 2
    вы никогда не должны перемещать класс, просто потому, что он более удобен для вас! Каждый класс имеет свою цель, и цель должна определить, где он должен быть расположен в вашем пакете. – Sauer 8 September 2015 в 21:01
3
ответ дан demongolem 21 August 2018 в 05:46
поделиться

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

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

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

21
ответ дан Dimitris 21 August 2018 в 05:46
поделиться
  • 1
    Это и послужило причиной для меня. Я не знаю почему, но он это исправил. В Eclipse я сделал это из меню: Project -> Clean..., и он работал, когда я нажал кнопку run. – Water 12 April 2015 в 01:30
  • 2
    Кажется, что очистка файлов сборки проекта делает трюк. Работает также с greadle clean. – ttarczynski 23 October 2015 в 05:46

Я наткнулся на ту же проблему. Программа отлично работала от 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 21 August 2018 в 05:46
поделиться

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

14
ответ дан Evaldas Ilginis 21 August 2018 в 05:46
поделиться
  • 1
    да, это работает, и если вы не хотите называть getClassLoader(), важно указать корневую косую черту на пути, как FXMLLoader(App.class.getResource("/fxml/ObjOverview.fxml")); – Zavael 6 August 2015 в 12:47
  • 2
    Спас мой день! Если вы используете maven, вы должны хранить ваши файлы fxml в папке с ресурсами! @Evaldas Illginis имеет эту структуру папок: resources/fxml/ObjOverview.fxml – Bolic 26 December 2015 в 12:51
  • 3
    @Bolic Эта папка resources должна находиться внутри папки src? Вы знаете, должно ли это работать в Eclipse? – leandrocoutom 14 July 2018 в 22:44

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

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

0
ответ дан HDJEMAI 21 August 2018 в 05:46
поделиться

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

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

0
ответ дан kingdonnaz 21 August 2018 в 05:46
поделиться

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

через несколько минут, я подумал, что я пытался загрузить файл.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 21 August 2018 в 05:46
поделиться

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

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

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

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 21 August 2018 в 05:46
поделиться
  • 1
    Мне нравится, когда сообщение об ошибке не имеет ничего общего с проблемой;) EDIT: помощник может быть более общим: FXMLLoader (getClass (). GetResource (& quot; / & quot; + report.getClass (). GetCanonicalName (). ReplaceAll («.», «/»). replaceAll («Контроллер», «») + «.fxml»)); – pdem 5 December 2017 в 10:19
  • 2
    Но мы уверены, что написали правильное имя ... – Carlos López 31 March 2018 в 17:15
2
ответ дан Sauer 21 August 2018 в 05:46
поделиться

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

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

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

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

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

4
ответ дан svarog 21 August 2018 в 05:46
поделиться
  • 1
    Обратите внимание, что если ресурсы упакованы в файл jar, .. не будет разрешать их, поскольку протокол jar: не поддерживает локальный каталог каталогов ... – jewelsea 13 January 2016 в 00:32

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

1
ответ дан Victor Grazi 21 August 2018 в 05:46
поделиться

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

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

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

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

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

xyz

вместо

x / y / z

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

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

0
ответ дан ycomp 21 August 2018 в 05:46
поделиться
  • 1
    Кстати. 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();      
}

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

1
ответ дан Zoe 21 August 2018 в 05:46
поделиться
  • 1
    Да, он работал без отображения сообщения об ошибке. Но вы отменили .close (), чтобы этапы сохраняли стекирование без закрытия. То, что я пытаюсь сделать, это как JFrame. Вы открываете JFrame, выбираете что-то, после чего текущий будет закрыт, и откройте еще один. – user 21 June 2013 в 09:57
  • 2
    О, ладно, я отменил то, что вы делаете :). Как я уже говорил, проще использовать глобальные переменные. Добавить сцену globalScene, в FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null; Тогда у вас будет только одна сцена, вы можете вращаться, закрывать и создавать другую. – Lionnel Afangbedjee 21 June 2013 в 14:00
  • 3
    Или в любом случае Добавить Stage CurrentStage = null, в FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null; Тогда у вас будет только одна сцена, которую вы можете вращать, закрывать и создавать другую. Теперь вам может быть возможно, закрыть CurrentStage и создать новый. Дайте мне знать, если это сработает для вас. Lionnel – Lionnel Afangbedjee 21 June 2013 в 14:08
  • 4
    Можете ли вы показать мне пример? Я не могу понять, что вы имеете в виду – user 24 June 2013 в 12:47
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

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

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

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