如何将fxml加载器的位置设置为另一个包中的fxml

时间:2018-06-12 17:56:48

标签: java fxml

我正在尝试创建一个具有制作新项目对话框的应用。我已经编程了但是想要清理文件结构,所以我将对话框及其控制器的fxml移动到自己的包中。该对话框的文件位于名为newItemDialog的包中。当我尝试启动它时,我得到一个java.lang.IllegalStateException:Location没有设置错误。我已经在how to locate fxml from another package?

尝试了解决方案

这是我项目文件结构的图片: Project File Structure

以下是启动对话框的代码

@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 :(得分:1)

在大多数情况下,.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"));

答案 1 :(得分:1)

你应该在没有第一个斜杠的情况下使用getClass().getResource("newItemDialog/newToDoItem.fxml")