2016-09-03 24 views
0

我在這種情況下我在表格單元格中的DatePicker編輯狀態:JavaFX的:更改基於另一個細胞

我有一個表「訪問」有一系列的列。 表格是可編輯的,您可以通過按鈕添加更多空行。

其中一列取決於另一列。 主列有它自己的cellFactory來呈現組合框。 輔助列有其自己的cellFactory來創建日期選擇器。

現在,該表的二次電池只有在主塔的單元中,在不同的國家「一無所有」

一切正常,只是我需要點擊組合框的狀態的一個改變每當輔助小區在狀態變爲「無」時更新它。

爲了彌補,我在主列的setOnEditCommit中使用了table.refresh()函數。但是,如果您使用此功能並且單元處於「無」狀態,則所有輔助單元將變爲無效。

我該如何解決?

這是次級柱

public class DataEditingCellVisite extends TableCell<Visite, LocalDate> { 

private DatePicker datePicker = new DatePicker(getDate()); 
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 

public DataEditingCellVisite() { 
    datePicker.setDisable(true); 
} 


@Override 
public void startEdit() { 

    if(!this.getTableView().getItems().get(this.getTableView().getSelectionModel().getSelectedIndex()).getStato().equals("")) { 
     datePicker.setDisable(false); 
     commitEdit(datePicker.getValue()); 
    } else { 
     datePicker.setDisable(true); 
     setText(null); 
     commitEdit(null); 
    } 

    if (!isEmpty() && !datePicker.isDisable()) { 
    super.startEdit(); 
    createDatePicker(); 
    setText(null); 
    setGraphic(datePicker); 
    } 
} 

@Override 
public void cancelEdit() { 
    super.cancelEdit(); 
    if(getDate() != null) 
     setText(getDate().format(formatter)); 
    setGraphic(null); 
} 

@Override 
public void updateItem(LocalDate item, boolean empty) { 
    super.updateItem(item, empty); 

    if (empty) { 
     setText(null); 
     setGraphic(null); 
    } else { 
     if (isEditing()) { 
      if (datePicker != null) { 
       datePicker.setValue(getDate()); 
      } 
      setText(null); 
      setGraphic(datePicker); 
     } else { 
      setGraphic(null); 
      if(datePicker.isDisable()) 
       setText(null); 
      else 
       if(getDate() != null) 
        setText(getDate().format(formatter)); 
     } 
    }     
} 

@Override 
public void commitEdit(LocalDate value) { 
    super.commitEdit(value); 
     ((Visite)this.getTableRow().getItem()).setDataParto(value); 
} 

private void createDatePicker() { 
    datePicker.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2); 
    datePicker.setOnAction((e) -> { 
     if(datePicker.getValue() != null) 
      commitEdit(datePicker.getValue()); 
    }); 
    datePicker.addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
     if (event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB) { 
      if(datePicker.getValue() != null) 
       commitEdit(datePicker.getValue()); 
     } 
    }); 
    datePicker.focusedProperty().addListener(new ChangeListener<Boolean>(){ 
     @Override 
     public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) { 
      if(!arg2) { 
       if(datePicker.getValue() != null) 
        commitEdit(datePicker.getValue()); 
      } 
     } 
    }); 
} 

private LocalDate getDate() { 
    return getItem() == null ? null : getItem(); 
} 
} 

回答

0

的電池工廠的代碼,我發現,在此基礎上其他解決方案 JavaFX TableView: format one cell based on the value of another in the row

的人誰需要它的解決方案:

我在主列的CommitEdit中留下了table.refresh()方法,並且以這種方式更改了輔助列的UpdateItem方法。

int currentIndex = indexProperty() 
        .getValue() < 0 ? 0 
        : indexProperty().getValue(); 
      String type = this 
        .getTableView().getItems() 
        .get(currentIndex).getStato(); 
      if (type.equals("")) { 
       if(getText() != null) { 
        setText(null); 
        commitEdit(null); 
       } 
      } else if(getDate() != null) { 
       this.setText(getDate().format(formatter)); 
      }