我在使用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
由于here或here的解释,我希望远离涉及SimpleDateFormat
(+ DateFormatter
)的解决方案,因为应考虑java.util.Date
遗产(请参阅旧代码here)。
是否有将DateTimeFormatter
与JFormattedTextField
集成的解决方案,或者我被阻止了:
我还希望远离MaskFormatter,因为它不允许像"25:70:90"
这样的内容轻松处理错误。
答案 0 :(得分: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);
}
}
}
从这里我可以解析并显示LocalTime,虽然在我的实现中它非常笨拙。
答案 1 :(得分:0)
您可以使用LGoodDatePicker的TimeTableEditor:https://github.com/LGoodDatePicker/LGoodDatePicker/blob/master/Project/src/main/java/com/github/lgooddatepicker/tableeditors/TimeTableEditor.java