具有JSpinner时间格式的CellEditor恢复为日期格式

时间:2017-08-07 14:02:28

标签: java swing jtable tablecelleditor tablecolumn

我正在尝试为DefaultCellEditor列创建JTable,以便我可以设置计划的开始时间和结束时间。 但是,我无法弄清楚为什么当我使用JSpinner单元格中的JTable输入时间时,我看到正确的格式选择时间,但是当我按下回车或取消选择时当前单元格,我得到一个完整的日期而不是时间

这是我的DefaultCellEditor JSpinner

public class ScheduleCellEditor extends DefaultCellEditor {

    private final JSpinner timeSpinner;

    public ScheduleCellEditor() {
        super(new JTextField());
        timeSpinner = new JSpinner();

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 24);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        Date date = new Date();
        SpinnerDateModel model = new SpinnerDateModel(date, null, null, Calendar.HOUR_OF_DAY);
        model.setValue(calendar.getTime());
        timeSpinner.setModel(model);

        JSpinner.DateEditor editor = new JSpinner.DateEditor(timeSpinner, "HH:mm");
        DateFormatter formatter = (DateFormatter) editor.getTextField().getFormatter();
        formatter.setAllowsInvalid(false);
        formatter.setOverwriteMode(true);

        timeSpinner.setEditor(editor);
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return timeSpinner;
    }

    @Override
    public Object getCellEditorValue() {
        return timeSpinner.getValue();
    }

}

以下是我将DefaultCellEditor设置为JTable TableColumn的方式

    TableColumnModel columnModel = jtblSchedule.getColumnModel();
    TableColumn startTimeCol = columnModel.getColumn(1);
    TableColumn endTimeCol = columnModel.getColumn(2);
    startTimeCol.setCellEditor(new ScheduleCellEditor());
    endTimeCol.setCellEditor(new ScheduleCellEditor());

当我点击单元格并选择时间时,它显示正确的格式,我只看到 HH:mm

enter image description here

当我单击单元格或单击其他位置时,即使将编辑器和模型格式化为时间,我也会得到完整的日期。

enter image description here

您对如何解决此问题有任何建议吗?我只需要时间来展示而不是完整的约会。

我会感激任何帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

您的TableCellEditor似乎已经有序,但您仍然会获得时间值的默认renderer。您需要custom renderer一个合适的SimpleDateFormat。改编自example,可能是这样的:

private static final DateFormat TIME_FORMAT = DateFormat.getTimeInstance();
…
private class TimeRenderer extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean selected, boolean focused, int row, int column) {
        super.getTableCellRendererComponent(table, value, selected, focused, row, column);
        setText(TIME_FORMAT.format((Date) value));
        return this;
    }
}
…
TimeRenderer timeRenderer = new TimeRenderer();
startTimeCol.setCellRenderer(timeRenderer);
endTimeCol.setCellRenderer(timeRenderer);