Если вы посмотрите на подпись FXMLLoader#load(URL)
, вы увидите:
public static <T> T load(URL location) throws IOException
Обратите внимание на <T>
? Это делает метод универсальным, а параметр типа используется в качестве возвращаемого типа метода. Это то, что позволяет вам присвоить результат вызова #load(URL)
переменной любого типа, например, что вы делаете.
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Вы можете буквально изменить тип root
на любой другойтип и код все равно будет компилироваться. Однако в настоящее время в приведенном выше коде T
выводится как Parent
. В этом случае используется приведение, как если бы метод #load(URL)
возвратил Object
вместо T
.
Parent root = (Parent) FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Проблема в том, что ваш FXML объявляет корневой элемент длябыть ImageView
. Это означает, что фактический тип объекта, возвращаемого методом #load(URL)
, равен ImageView
, а не Parent
, а класс ImageView
не является подтипом Parent
, то есть ClassCastException
.
Один из вариантов - использовать ImageView root = ...;
. Однако этого недостаточно, потому что вы пытаетесь использовать root
в качестве корня Scene
, который должен быть Parent
. Лучшее решение - обернуть ImageView
в Parent
в файле FXML. Вот пример использования StackPane
:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="dragdrop.FXMLDocumentController">
<ImageView fx:id="ImgID" fitHeight="228.0" fitWidth="248.0" onDragDone="#ondragdone"
pickOnBounds="true" preserveRatio="true"/>
</StackPane>