gpt4 book ai didi

java - JavaFX 中的 ClassCastException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:54 24 4
gpt4 key购买 nike

我的代码出现以下错误。

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 的内部结构。此外,TreeCellSkin1LabeledText 都是内部类。内部代码如有更改,恕不另行通知,也不考虑第三方对它的依赖。由于这适用于 Java 6 而不是 Java 8 我只能假设 ImageView 的祖 parent 从 TreeCell 变成了 Group在两个版本之间。

要解决此问题,您可以查看实现并了解您需要做什么才能再次到达TreeCell,但这不会真的 解决问题。 EventTarget 的使用告诉我这段代码是在不完全理解事件处理在 JavaFX 中的工作方式的情况下实现的。从这段代码的明显目标来看,您应该使用事件的,而不是目标。在 JavaFX 中,事件源始终是当前处理所述 EventEventHandler 被添加到 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 中的公共(public) API。它们是 javafx.scene.control.skin 包的一部分。
<补充>2。还有更多内容,但这超出了本答案的范围。

关于java - JavaFX 中的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com