【问题标题】:CellEditor with JSpinner Time format reverts to date format具有 JSpinner 时间格式的 CellEditor 恢复为日期格式
【发布时间】:2018-01-14 20:55:49
【问题描述】:

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

这是我的DefaultCellEditorJSpinner

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设置为JTableTableColumns的方法

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

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

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

您对如何解决这个问题有什么建议吗?我只需要时间来显示,而不是完整的日期。

我将不胜感激。

谢谢。

【问题讨论】:

    标签: java swing jtable tablecelleditor tablecolumn


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多