2017-07-31 6 views
0

ListView私はContextMenuを追加しようとしています。私はContextMenuが見つかりましたが、別の問題があります。ListView CellFactory - セルを正しく削除する方法

マイsetCellFactoryコード、セットアップに使用されるコンテキストメニュー:

lvAppetites.setCellFactory(lv -> { 
    ListCell<Appetite> cell = new ListCell<>(); 
    ContextMenu contextMenu = new ContextMenu(); 

    MenuItem editAppetiteMenu = new MenuItem(); 

    editAppetiteMenu.textProperty().bind(Bindings.format("Edit ...")); 
    editAppetiteMenu.setOnAction(event -> { 
     // Code to load the editor window 
     editAppetite(cell.getItem()); 
    }); 
    contextMenu.getItems().add(editAppetiteMenu); 

    MenuItem deleteAppetiteMenu = new MenuItem(); 
    deleteAppetiteMenu.textProperty().bind(Bindings.format("Delete ...")); 
    deleteAppetiteMenu.setOnAction(event -> { 
     // Code to delete the appetite 
    }); 
    contextMenu.getItems().add(deleteAppetiteMenu); 

    contextMenu.getItems().add(new SeparatorMenuItem()); 

    MenuItem addAppetiteMenu = new MenuItem(); 
    addAppetiteMenu.textProperty().bind(Bindings.format("Add New ...")); 
    addAppetiteMenu.setOnAction(event -> { 
     // Code to delete the appetite 
    }); 
    contextMenu.getItems().add(addAppetiteMenu); 

    cell.textProperty().bind(cell.itemProperty().asString()); 

    // If nothing selected, remove the context menu 
    cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> { 
     if (isNowEmpty) { 
      cell.setContextMenu(null); 
     } else { 
      cell.setContextMenu(contextMenu); 
     } 
    }); 
    return cell; 
}); 

マイListViewがリスナーにTextFieldて検索可能です。リスナーはユーザータイプとしてListViewの項目をフィルタリングします。

問題は、リストがフィルタされると、空のセルにnullと表示されるようになりました。

別のquestionを読むことから、ListViewがまだ削除されたセルのグラフィックを表示していると確信しています。私はupdateItemメソッドをオーバーライドすることによってListView内でそれを処理する方法を知っていますが、代わりに私のsetCellFactoryメソッド内からこれを処理するでしょうか?

それも可能ですか、私はすべてListViewをリファクタリングする必要がありますか?

いつものように、あなたの助けをありがとう!

+1

コードをセルの工場でインラインで実行しようとするのではなく、 'updateItem'をオーバーライドし、ロジックを処理すると、バインディングとリスナーではなく、これを達成するための「標準的な」方法があります。 – jewelsea

答えて

1

問題はライン

cell.textProperty().bind(cell.itemProperty().asString()); 

セルが空の場合、アイテムはnullになりますから生じるので、結合意志が(私は信じている)文字列"null"に評価されます。

セルが空であるかどうか、またはヌルであるアイテムを試してみてください。

cell.textProperty().bind(Bindings 
    .when(cell.emptyProperty()) 
    .then("") 
    .otherwise(cell.itemProperty().asString())); 

または(感謝精錬のため、このバージョンを@fabianする)updateItem` `で(彼らはまた、更新として登録してアイテムの削除を含む)のリストセルをバックアップする項目への更新を処理しないのはなぜ

cell.textProperty().bind(Bindings.createStringBinding(
    () -> Objects.toString(cell.getItem(), ""), 
    cell.itemProperty())); 
+0

いつものように、@ James_Dありがとうございます。以前は 'when' /' then'/'otherwise'パラダイムは見たことがありませんでした。 – Zephyr

関連する問題