JavaFX:根据另一个单元格更改 Table 单元格中的 DatePicker 编辑状态
JavaFX: Change a DatePicker Editing Status in Table Cell based on another cell
我处于这种情况:
我有一个包含一系列列的 table "Visit"。
table 是 editable,您可以通过按钮添加更多空行。
其中一列依赖于另一列。
主列有自己的 cellFactory 来呈现组合框。
辅助列有自己的 cellFactory 来创建日期选择器。
现在,只有当主列的单元格采用组合框的状态之一时,才能更改 table 的辅助单元格,状态 "nothing"
一切正常,除了我需要每次单击辅助单元格以在状态变为 "nothing."
时更新它
为了补救,我在主栏的 setOnEditCommit 中使用了 table.refresh() 函数。但是,如果您使用此功能并且单元格处于 "nothing" 状态,则所有辅助单元格都将变为无效。
我该如何解决?
这是副列细胞工厂的代码
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();
}
}
我找到了基于这个其他解决方案的解决方案
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));
}
我处于这种情况:
我有一个包含一系列列的 table "Visit"。 table 是 editable,您可以通过按钮添加更多空行。
其中一列依赖于另一列。 主列有自己的 cellFactory 来呈现组合框。 辅助列有自己的 cellFactory 来创建日期选择器。
现在,只有当主列的单元格采用组合框的状态之一时,才能更改 table 的辅助单元格,状态 "nothing"
一切正常,除了我需要每次单击辅助单元格以在状态变为 "nothing."
时更新它为了补救,我在主栏的 setOnEditCommit 中使用了 table.refresh() 函数。但是,如果您使用此功能并且单元格处于 "nothing" 状态,则所有辅助单元格都将变为无效。
我该如何解决?
这是副列细胞工厂的代码
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();
}
}
我找到了基于这个其他解决方案的解决方案 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));
}