Как установить местоположение загрузчика fxml для fxml в другом пакете - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать приложение, в котором есть диалог для создания нового элемента.Я уже запрограммировал его, но хотел очистить структуру файла, поэтому я переместил fxml для диалога и его контроллера в их собственный пакет.Файлы для диалога находятся в пакете с именем newItemDialog.Когда я пытаюсь запустить его, я получаю исключение java.lang.IllegalStateException: Местоположение не установлено.Я уже пробовал решение на , как найти fxml из другого пакета?

Вот изображение структуры файла моего проекта: Структура файла проекта

Вот код для запуска диалога

@FXML
public void showNewItemDialog() {
    Debug.getInstance().log("Entering showNewItemDialog method", false);
    Dialog<ButtonType> dialog = new Dialog<>();
    dialog.initOwner(mainBorderPane.getScene().getWindow());
    dialog.setTitle("Create new item");
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(getClass().getResource("/newItemDialog/newToDoItem.fxml"));
    try {
        dialog.getDialogPane().setContent(fxmlLoader.load());
    } catch(IOException e) {
        Debug.getInstance().log("An error has occurred in the showNewItemDialog method\n", true);
        e.printStackTrace();
        return;
    }

    dialog.getDialogPane().getButtonTypes().add(ButtonType.OK);
    dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL);

    Optional<ButtonType> result = dialog.showAndWait();
    if(result.isPresent() && result.get() == ButtonType.OK) {
        Debug.getInstance().log("Updating ListView", false);
        NewItemDialogController controller = fxmlLoader.getController();
        ToDoItem newItem = controller.processResults();
        toDoListView.getSelectionModel().select(newItem);
    }
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы должны использовать getClass().getResource("newItemDialog/newToDoItem.fxml") без первой косой черты.

0 голосов
/ 12 июня 2018

В большинстве этих случаев путь к файлу .fxml задан неправильно.Вы можете попробовать установить правильный путь, например:

1.используя абсолютный путь:

FXMLLoader loader = new  XMLLoader(getClass().getResource("/com/vincent/todo/newItemDialog/newToDoItem.fxml"));

2.используя относительный путь:

FXMLLoader loader = new  XMLLoader(getClass().getResource("newItemDialog/newToDoItem.fxml"));

3.используя класс из того же пакета:

FXMLLoader loader = new  XMLLoader(NewItemDialogController.class.getResource("newToDoItem.fxml"));
...