私のコードは次のエラーを取得します。
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 8のJava 6ではなく、働いていたので、私だけと仮定することができますImageView
の祖父母であることから変化しTreeCell
ているにGroup
2つのバージョン間を。
この問題を解決するには、可能性があり、実装に見て、あなたはあなたが届くように、何をする必要があるか見TreeCell
、再び、それはないだろう、本当に問題を解決します。使用はEventTarget
完全にイベント処理は、JavaFXの中でどのように機能するかを理解していないながら、私にはこのコードが実装されましたと言います。このコードの見かけ上の目的からは、使用する必要がありますソースイベント、ないのターゲットを。JavaFXのでは、イベントのソースは、常にするオブジェクトであるEventHandler
現在取り扱いが前記Event
に加えた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.よりそれにありますが、それはこの答えの範囲を超えています。