JavaFX:根据另一个单元格更改表格单元格中的DatePicker编辑状态

时间:2016-09-03 12:42:10

标签: javafx combobox datepicker tableview tablecell

我正处于这种情况:

我有一系列专栏“访问”。 该表是可编辑的,您可以通过按钮添加更多空白行。

其中一列取决于另一列。 主列有自己的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();
 }
}

1 个答案:

答案 0 :(得分: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));
            }