我正在尝试为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
当我单击单元格或单击其他位置时,即使将编辑器和模型格式化为时间,我也会得到完整的日期。
您对如何解决此问题有任何建议吗?我只需要时间来展示而不是完整的约会。
我会感激任何帮助。
感谢。
答案 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);