次のクラスで DatePicker を TableView に追加しました: https://code.google.com/p/javafx-filterable-table-columns/source/browse/src/main/java/thirdparty/eu/schudt/ javafx/controls/calendar/DatePicker.java?r=db47db237b3342712aafb693f392d403455d5299
DatePickerCell クラスを使用して、TableCell を無効にします。DatePicker は TableView で適切に表示されます。しかし、updateItem メソッドはうまく機能せず、ObservableList を更新しません。
ここで何が欠けていますか?誰でも同じ問題に直面できますか?
これが私のコードです:
import java.text.SimpleDateFormat;
import java.util.Locale;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Pos;
import javafx.scene.control.TableCell;
import thirdparty.eu.schudt.javafx.controls.calendar.DatePicker;
public class DatePickerCell<S, T> extends TableCell<S, T> {
private final DatePicker datePicker;
private ObservableValue<T> ov;
public DatePickerCell() {
// Initialize the DatePicker for birthday
this.datePicker = new DatePicker(Locale.ENGLISH);
this.datePicker.setDateFormat(new SimpleDateFormat("dd/MM/yyyy"));
this.datePicker.getCalendarView().todayButtonTextProperty().set("Today");
this.datePicker.getCalendarView().setShowWeeks(false);
this.datePicker.getStylesheets().add("styles/DatePicker.css");
this.setAlignment(Pos.CENTER);
this.setGraphic(this.datePicker);
}
@Override
public void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
setGraphic(this.datePicker);
}
}
FXController コードの cellFactory の部分:
@FXML
private TableColumn revueDateCol;
this.revueDateCol.setCellFactory(new Callback<TableColumn<Revue, Date>, TableCell<Revue, Date>>() {
@Override
public TableCell<Revue, Date> call(TableColumn<Revue, Date> arg0) {
return new DatePickerCell<>();
}
});
助けてくれてありがとう。
この方法で実装しようとしましたが、スクロールするとセルが元の値に戻ります。何か案が ?
public class DatePickerCell<S, T> extends TableCell<Revue, Date> {
private DatePicker datePicker;
public DatePickerCell() {
if (datePicker == null) {
createDatePicker();
}
setGraphic(datePicker);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(new Runnable() {
@Override
public void run() {
datePicker.requestFocus();
}
});
}
@Override
public void updateItem(Date item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (datePicker != null) {
datePicker.setSelectedDate(getDate());
}
setGraphic(this.datePicker);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
}
private void createDatePicker() {
datePicker = new DatePicker(Locale.FRENCH);
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
datePicker.setDateFormat(formatter);
datePicker.setPromptText("jj/mm/aaaa");
datePicker.getCalendarView().todayButtonTextProperty().set("Aujourd'hui");
datePicker.getCalendarView().setShowWeeks(false);
datePicker.getStylesheets().add("/styles/datePicker.css");
datePicker.selectedDateProperty().addListener(
new ChangeListener<Date>() {
@Override
public void changed(ObservableValue<? extends Date> observable,
Date oldValue, Date newValue) {
commitEdit(newValue);
}
});
setAlignment(Pos.CENTER);
}
private Date getDate() {
return datePicker.getSelectedDate() != null ? datePicker.getSelectedDate() : getItem();
}
@Override
public void startEdit() {
super.startEdit();
}
@Override
public void cancelEdit() {
super.cancelEdit();
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
よろしく、