JavaFXの中に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 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 8のJava 6ではなく、働いていたので、私だけと仮定することができますImageViewの祖父母であることから変化しTreeCellているにGroup2つのバージョン間を。

この問題を解決するには、可能性があり、実装に見て、あなたはあなたが届くように、何をする必要があるか見TreeCell、再び、それはないだろう、本当に問題を解決します。使用はEventTarget完全にイベント処理は、JavaFXの中でどのように機能するかを理解していないながら、私にはこのコードが実装されましたと言います。このコードの見かけ上の目的からは、使用する必要がありますソースイベント、ないのターゲットをJavaFXのでは、イベントのソースは、常にするオブジェクトであるEventHandler現在取り扱いが前記Eventに加えた2あなたが追加した場合、つまり、EventHandlerTreeCell、ソースになりますTreeCellソースを使用して、仮定EventHandlerに添加しますTreeCell、あなたは簡単に行うことができます。

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

もちろん、あなたが追加している場合EventHandlerTreeCellあなたはおそらく、あなたがアクセスしていますように、ソースを気にする必要はありません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.よりそれにありますが、それはこの答えの範囲を超えています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=205416&siteId=1