JTable определяет редактор для типа LocalTime

Я использую Java 8 после следующей документации:

Я хотел бы настроить специализированный форматтер при редактировании столбца в JTable. Этот столбец содержит java.time.LocalTime экземпляры.

JTable table;
...
table.setDefaultEditor(LocalTime.class, new LocalTimeEditor());

Где LocalTimeEditor определяется (предварительно):

public class LocalTimeEditor extends DefaultCellEditor {
    JFormattedTextField ftf;

  public LocalTimeEditor() {
    super(new JFormattedTextField());
    ftf = (JFormattedTextField) getComponent();

    // Set up the editor for the LocalTime cells.
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
    ftf.setFormatterFactory(new DefaultFormatterFactory(dateFormatter));

Но это приводит к следующей ошибке компиляции:

The constructor DefaultFormatterFactory(DateTimeFormatter) is undefined

Я хотел бы держаться подальше от решения с участием SimpleDateFormat (+ DateFormatter), как описано здесь или здесь, так как java.util.Date следует считать устаревшим (см. старый код здесь).

Есть ли решение для интеграции DateTimeFormatter с JFormattedTextField, или я заблокирован:

Я также хотел бы держаться подальше от MaskFormatter, так как это не позволяет легко обрабатывать ошибки для чего-то вроде: "25:70:90".

Ответ 1

В соответствии с аргументом DefaultFormatterFactor я создал новый JFormattedTextField.AbstractFormatter

class JTFormater extends JFormattedTextField.AbstractFormatter{
    final DateTimeFormatter formatter;
    public JTFormater(DateTimeFormatter formatter){
        this.formatter =  formatter;
    }
    @Override
    public Object stringToValue(String text) throws ParseException {
        return formatter.parse(text);
    }

    @Override
    public String valueToString(Object value) throws ParseException {
        if(value instanceof TemporalAccessor){
            return formatter.format((TemporalAccessor) value);
        } else{
            throw new ParseException("not a valid type at", 0);
        }
    }
}

Из этого я мог разобрать и отобразить LocalTime, хотя в моей реализации он довольно неуклюжий.