【发布时间】:2017-10-19 14:07:01
【问题描述】:
我有一个包含 2 列“Date”(LocalDate)和“FX”(Double)的 TableView。我已启用单元格编辑,并按照我在此处找到的示例 (http://physalix.com/javafx8-render-a-datepicker-cell-in-a-tableview/) 创建了一个自定义 CellFactory,它为“日期”列的单元格显示 DatePicker。尽管此解决方案会立即呈现 DatePciker,但我将代码更改为仅在用户双击任何(非空)日期单元格时才显示 DatePicker。到目前为止一切顺利……
在用户更改日期或取消输入后,如何“返回”并从单元格中删除 DatePicker 渲染?请参阅图片作为参考。图 1 是列表的初始状态。图2是双击后。如何返回到图 1 状态?如果您需要查看我的具体代码,请告诉我。
这是检查双击然后创建 CellFactory 的代码
fxTable.getSelectionModel().setCellSelectionEnabled(true);
fxTable.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (event.getClickCount() == 2) {
TablePosition pos = fxTable.getSelectionModel().getSelectedCells().get(0);
int col = pos.getColumn();
if (col == 0) {
//The code below creates the DatePicker in the cell using the DatePickerCell class that I created following the example in the code I found
tblDateFX.setCellFactory(new Callback<TableColumn<Map.Entry<LocalDate, Double>, String>, TableCell<Map.Entry<LocalDate, Double>, String>>() {
@Override
public TableCell<Map.Entry<LocalDate, Double>, String> call(TableColumn<Map.Entry<LocalDate, Double>, String> param) {
ObservableMap<LocalDate, Double> items = FXCollections.observableMap(myBasket.getEnrtriesCur(curName));
DatePickerCell datePick = new DatePickerCell(items);
return datePick;
}
});
}
}
}
});
这是 DatePickerCell 类
public class DatePickerCell<S, T> extends TableCell<Map.Entry<LocalDate,Double>, String> {
private DatePicker datePicker;
private ObservableMap<LocalDate,Double> curEntries;
public DatePickerCell(ObservableMap<LocalDate,Double> curEntries) {
super();
this.curEntries = curEntries;
if (datePicker == null) {
createDatePicker();
}
setGraphic(datePicker);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(new Runnable() {
@Override
public void run() {
datePicker.requestFocus();
}
});
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (null == this.datePicker) {
System.out.println("datePicker is NULL");
}
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
setContentDisplay(ContentDisplay.TEXT_ONLY);
} else {
datePicker.setValue(LocalDate.parse(item,df));
setGraphic(this.datePicker);
setText(item);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
}
}
@Override
public void startEdit() {
super.startEdit();
}
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
setGraphic(null);
}
private void createDatePicker() {
this.datePicker = new DatePicker();
datePicker.setEditable(true);
datePicker.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
setGraphic(datePicker);
setText(df.format(datePicker.getValue()));
}
});
datePicker.setOnAction(new EventHandler() {
public void handle(Event t) {
LocalDate date = datePicker.getValue();
int index = getIndex();
commitEdit(df.format(date));
if (null != getCurEntries()) {
System.out.println("Modify value");
}
}
});
setAlignment(Pos.CENTER);
}
【问题讨论】:
-
请将您的代码添加到示例中,否则很难帮助您。
-
您链接的代码质量很低。您可能想找到(或只是编写)单元的更好实现。
-
@James_D 我还是一个 Java 新手,很遗憾我自己无法编写那种代码,而且我找不到其他任何可行的方法。
-
@Gabriele TBH,没有人应该写那种代码。
-
@James_D 啊!很高兴知道! :) 我将在另一个问题中问什么是在单元格中呈现 DatePicker 的好代码。
标签: java datepicker tableview javafx-8