2017-06-22 52 views
0

我有一個TableView和定製MyTableCell extends CheckBoxTreeTableCell<MyRow, Boolean>,根據該電池是@OverriddenupdateItem方法:JavaFX的:UDPATE TableCell的

@Override 
public void updateItem(Boolean item, boolean empty) { 
    super.updateItem(item, empty); 
    if(!empty){ 
     MyRow currentRow = geTableRow().getItem(); 
     Boolean available = currentRow.isAvailable(); 
     if (!available) { 
      setGraphic(null); 
     }else{ 
      setGraphic(super.getGraphic()) 
     } 
    } else { 
     setText(null); 
     setGraphic(null); 
    } 
} 

我有一個ComboBox<String>在那裏我有一些項目,當我改變的價值組合框我想根據選定的值設置複選框的可見性。所以我有一個聽衆:

comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { 
     if (newValue.equals("A") || newValue.equals("S")) { 
      data.stream().filter(row -> row.getName().startsWith(newValue)).forEach(row -> row.setAvailable(false)); 
     } 
    }); 
  • dataObservableList<MyRow>
  • 這只是一個例子,我的代碼的簡化版本

當我改變ComboBox中表的價值chekboxes不會消失,直到我滾動或單擊該單元格。有一個「溶劑」可以撥打table.refresh();,但我不想刷新整個表格,因爲我只想刷新一個單元格。所以我試圖添加一些偵聽器來觸發updateItem,但是我在每次嘗試時都失敗了。你有什麼想法如何觸發一個單元格的更新機制,而不是整個表格?

回答

1

結合細胞的圖形,而不是僅僅將它設置:

private Binding<Node> graphicBinding ; 

@Override 
protected void updateItem(Boolean item, boolean empty) { 
    graphicProperty().unbind(); 
    super.updateItem(item, empty) ; 

    MyRow currentRow = getTableRow().getItem(); 

    if (empty) { 
     graphicBinding = null ; 
     setGraphic(null); 
    } else { 
     graphicBinding = Bindings 
      .when(currentRow.availableProperty()) 
      .then(super.getGraphic()) 
      .otherwise((Node)null); 
     graphicProperty.bind(graphicBinding); 
    } 
} 
+0

一見鍾情,這是一個很好的解決方案,但我得到'RuntimeExceoption':綁定值不能在'super.updateItem設置(...)':setGraphic(null)' – Sunflame

+0

@Sunflame你有'graphicProperty()。unbind()'行嗎?我不明白你在那裏如何得到那個例外。 –

+0

是的,但我解決了''graphicProperty()。unbind()'與'super.updateItem(...)',所以它工作正常,非常感謝你:) – Sunflame