JavaFX中的ClassCastException

JavaFX中的ClassCastException,java,javafx,java-8,javafx-8,classcastexception,Java,Javafx,Java 8,Javafx 8,Classcastexception,我的代码得到以下错误 Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.Group cannot be cast to javafx.scene.control.TreeCell 源代码 private TreeItem getClickedTreeItem(EventTarget eventTarget){ TreeItem clickedTreeIte

我的代码得到以下错误

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.Group cannot be cast to javafx.scene.control.TreeCell
源代码

private TreeItem getClickedTreeItem(EventTarget eventTarget){
    TreeItem clickedTreeItem = null;

    if(eventTarget instanceof TreeCellSkin){
        clickedTreeItem = (TreeItem) ((TreeCell) ((TreeCellSkin)eventTarget).getParent()).getTreeItem();
    }else if(eventTarget instanceof LabeledText){
        clickedTreeItem = (TreeItem) ((TreeCell) ((LabeledText)eventTarget).getParent().getParent()).getTreeItem();
    }else if(eventTarget instanceof ImageView){
        clickedTreeItem = (TreeItem) ((TreeCell) ((ImageView)eventTarget).getParent().getParent()).getTreeItem();
    }

    return clickedTreeItem;
}
控制台显示这一行:

clickedTreeItem = (TreeItem) ((TreeCell) ((ImageView)eventTarget).getParent().getParent()).getTreeItem();
这是使用Java6的遗留代码,但使用Java8时会出现上述异常


现在是什么导致了
ClassCastException
,以及如何为Java8修复它?

当前代码很脆弱,因为它依赖于
TreeCell
的内部结构。另外,
TreeCellSkin
1和
LabeledText
都是内部类。内部代码如有变更,恕不另行通知,也不考虑第三方对其的依赖。由于这在Java 6中有效,而在Java 8中无效,我只能假设
ImageView
的祖父母从
TreeCell
变为两个版本之间的

要解决这个问题,您可以查看实现并查看需要做什么,然后再次访问
TreeCell
,但这并不能真正解决问题。
EventTarget
的使用告诉我,这段代码是在不完全理解JavaFX中事件处理工作原理的情况下实现的。从这段代码的明显目标来看,您应该使用事件的源,而不是目标。在JavaFX中,事件的源始终是当前处理所述
事件的
EventHandler
添加到2的对象。换句话说,如果将
EventHandler
添加到
TreeCell
中,则源将是
TreeCell
。使用源代码,并假设将
EventHandler
添加到
TreeCell
,您只需执行以下操作:

TreeItem<?> item = ((TreeCell<?>) event.getSource()).getTreeItem();

一,
TreeCellSkin
与许多(全部?)皮肤实现一起成为JavaFX9中的公共API。它们是
javafx.scene.control.skin
包的一部分。

2.还有更多,但这超出了这个答案的范围。

这里可能是尼斯的复制品!!
TreeView<String> treeView = new TreeView<>();
treeView.setCellFactory(tv -> {
    TreeCell<String> cell = new TreeCell<>(); // or some custom implementation
    cell.setOnMouseClicked(event -> {
        TreeItem<String> item = cell.getTreeItem();
        // do something with item...
    });
    return cell;
});