java - 带有 JSpinner 的 CellEditor 时间格式恢复为日期格式

标签 java swing jtable tablecelleditor tablecolumn

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

这是我的 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 设置为 JTable TableColumns

    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

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

我将不胜感激任何帮助。

谢谢。

最佳答案

您的 TableCellEditor 似乎正常,但您仍然得到默认的 renderer对于时间值(value)。您需要一个 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);

关于java - 带有 JSpinner 的 CellEditor 时间格式恢复为日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45548812/

相关文章:

java - 获取异常 java.lang.NoSuchMethodError : org. apache.neethi.Constants.isPolicyElement

java - 有没有办法强制java测试两个条件而不管第一个条件?

java - 点击JFrame的关闭按钮后如何删除MySql数据库记录?

java - 如何使用 GUI 组织服务器架构

java - 从编译的类文件中设置一个新项目 intellij IDEA

java - hibernate 中的部分架构导出

java - Gui放大时出现的问题

java - 我希望按下 JButton 后出现 JLabel

java - Java中一步步刷新JTable

java - 需要在此表上添加表头