繁体   English   中英

JavaFX中的ClassCastException

[英]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 1LabeledText都是内部类。 内部代码如有更改,恕不另行通知,且不考虑第三方对其的依赖。 由于这适用于Java 6而不是Java 8,我只能假设ImageView的祖父母从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中成为公共API以及许多(所有?)皮肤实现。 它们是javafx.scene.control.skin包的一部分。
2.还有更多内容,但这超出了这个答案的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM