2017-07-31 41 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'支持列表細胞(包括項目清除,因爲他們也登記爲更新)代碼而不是試圖在單元工廠內聯線?重寫'updateItem'並處理任何邏輯將會有「標準」的方式來完成,而不是通過綁定和監聽器。 – jewelsea

回答

1

問題就出現了從線

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

當細胞是空的,該項目將是空的,所以綁定將(我相信)評價到字符串"null"

嘗試測試單元格爲空或項目爲空的內容(例如,

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

或(感謝@fabian精煉這個版本)

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

謝謝@James_D,一如既往。我以前從來沒有見過「當然」/「否則」範例。 – Zephyr