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
をリファクタリングする必要がありますか?
いつものように、あなたの助けをありがとう!
コードをセルの工場でインラインで実行しようとするのではなく、 'updateItem'をオーバーライドし、ロジックを処理すると、バインディングとリスナーではなく、これを達成するための「標準的な」方法があります。 – jewelsea