2017-12-20 112 views
12

Tôi đang sử dụng Java 8, sau khi làm theo tài liệu:JTable xác định một biên tập viên cho localtime loại

tôi muốn thiết lập một định dạng đặc biệt khi chỉnh sửa một cột trong JTable tôi. Cột này chứa java.time.LocalTime trường hợp.

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

đâu LocalTimeEditor được xác định bởi (dự kiến):

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)); 

Nhưng điều này dẫn đến các lỗi biên dịch sau đây:

The constructor DefaultFormatterFactory(DateTimeFormatter) is undefined 

Tôi muốn tránh xa một giải pháp liên quan đến SimpleDateFormat (+ DateFormatter) như được giải thích here hoặc here, vì java.util.Date nên được xem xét ered di sản (xem mã cũ here).

Có một giải pháp để tích hợp DateTimeFormatter với JFormattedTextField, hay tôi bị chặn bởi:

Tôi cũng muốn tránh xa MaskFormatter, vì nó không cho phép dễ dàng xử lý lỗi cho một cái gì đó như: "25:70:90".

+0

Bạn có cần mở rộng [JFormattedTextField.AbstractFormatter] (https://docs.oracle.com/javase/8/docs/api/javax/swing/JFormattedTextField.AbstractFormatter.html) không? Sau đó, bạn sẽ chỉ cần thực hiện hai phương pháp trừu tượng? – matt

+0

Theo phân cấp JDK javadoc khá rõ ràng cho thấy rằng, với tất cả các ràng buộc bạn đã nêu, không có giải pháp nào trong JDK. Lựa chọn duy nhất của bạn là thực hiện của riêng bạn như @matt nói. – Gene

Trả lời

3

Theo lập luận của DefaultFormatterFactor, tôi đã tạo ra một mới 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); 
     } 
    } 
} 

Từ đó tôi có thể phân tích và hiển thị localtime, mặc dù trong thực hiện của tôi nó là khá vụng về.

Các vấn đề liên quan