我正在尝试为我的 JTable
列创建一个 DefaultCellEditor
,以便我可以设置计划的开始时间和结束时间。
但是,我不明白为什么当我在 JTable
的单元格中使用 JSpinner
输入时间时,我看到了选择时间的正确格式,但是当我按 Enter 键或取消选择当前单元格,我得到了整个日期,而不仅仅是时间。
这是我的 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
s
TableColumnModel columnModel = jtblSchedule.getColumnModel();
TableColumn startTimeCol = columnModel.getColumn(1);
TableColumn endTimeCol = columnModel.getColumn(2);
startTimeCol.setCellEditor(new ScheduleCellEditor());
endTimeCol.setCellEditor(new ScheduleCellEditor());
当我单击单元格并选择时间时,它会显示正确的格式,我只能看到 HH:mm
当我单击单元格外或单击其他位置时,即使编辑器和模型已格式化为时间,我也会获得完整日期。
您对如何解决这个问题有什么建议吗?我只需要显示时间而不是完整日期。
我将不胜感激任何帮助。
谢谢。
最佳答案
您的 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/