[英]ClassCastException in JavaFX
我的代码得到以下错误。
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();
这是与Java 6一起使用的遗留代码,但是使用Java8提供了上述异常?
什么可能导致ClassCastException
现在,以及如何为Java8修复它?
当前代码很脆弱,因为它依赖于TreeCell
的内部结构。 此外, TreeCellSkin
1和LabeledText
都是内部类。 内部代码如有更改,恕不另行通知,且不考虑第三方对其的依赖。 由于这适用于Java 6而不是Java 8,我只能假设ImageView
的祖父母从TreeCell
变为两个版本之间的Group
。
为了解决这个问题,你可以考虑实施,看看你需要做的,所以你到达TreeCell
一遍,但不会真正解决问题。 EventTarget
的使用告诉我这个代码是在没有完全理解JavaFX中事件处理如何工作的情况下实现的。 从此代码的明显目标来看,您应该使用事件的来源 ,而不是目标 。 在JavaFX中,事件的源始终是当前正在处理所述Event
的EventHandler
添加到2的对象 。 换句话说,如果您将EventHandler
添加到TreeCell
那么源将是TreeCell
。 使用源,并假设将EventHandler
添加到TreeCell
,您可以简单地执行:
TreeItem<?> item = ((TreeCell<?>) event.getSource()).getTreeItem();
当然,如果您将EventHandler
添加到TreeCell
您可能不需要打扰源,因为您可以直接访问TreeCell
。 例如:
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;
});
1. TreeCellSkin
在JavaFX 9中成为公共API以及许多(所有?)皮肤实现。 它们是javafx.scene.control.skin
包的一部分。
2.还有更多内容,但这超出了这个答案的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.