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;
});