簡體   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