JTable为LocalTime类型定义了一个编辑器

mal*_*lat 13 java swing

以下文档后我使用的是Java 8:

我想在编辑JTable中的列时设置专门的格式化程序.此列包含java.time.LocalTime实例.

JTable table;
...
table.setDefaultEditor(LocalTime.class, new LocalTimeEditor());
Run Code Online (Sandbox Code Playgroud)

其中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));
Run Code Online (Sandbox Code Playgroud)

但这会导致以下编译错误:

The constructor DefaultFormatterFactory(DateTimeFormatter) is undefined
Run Code Online (Sandbox Code Playgroud)

我想远离涉及SimpleDateFormat(+ DateFormatter)的解决方案,如此此处所述,因为java.util.Date应该被视为遗留(请参阅此处的旧代码).

是否有整合的解决方案DateTimeFormatterJFormattedTextField,还是我阻止:

我也想远离MaskFormatter,因为它不允许像以下那样简单的错误处理:"25:70:90".

mat*_*att 4

根据 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由此我可以解析并显示 LocalTime,尽管在我的实现中它非常笨拙。