[英]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.