У меня есть JXTable
с двумя столбцами, содержащими строковые значения, и одним столбцом, содержащим значение даты и времени в следующем формате: yyyy-MM-dd HH:mm:ss
.
Поскольку меня волнует только то, что пользователи изменят дату, я решил использовать DatePickerCellEditor
из пакета Swingx с пользовательским SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.
Пока все хорошо, за исключением того, что проблемы начинают возникать при запуске редактирования. Часть даты и времени сохраняется, однако часть времени сбрасывается на «00:00:00» и, что еще хуже, когда я перехожу к редактированию другой ячейки, значение, которое остается в ячейке, которая была отредактировано - правильная дата, но время в 00:00:00.
Другими словами, этот становится
Я пробовал многое, чтобы исправить это, в том числе переопределить getTableCellEditorComponent
из DatePickerCellEditor
и распечатать дату непосредственно из JXDatePicker
. Я обнаружил, что где-то по пути временная часть дня сбрасывалась на «00:00:00». Я не мог узнать, где. Затем я попытался в getTableCellEditorComponent
вручную установить дату с помощью JXDatePicker#setDate
, но это тоже не сработало.
Один обходной путь, который я нашел, заключался в том, что внутри getTableCellEditorComponent
вызывался JXDatePicker#getEditor
и вручную устанавливалась дата, однако временная часть значения ячейки по-прежнему сбрасывалась при остановке редактирования.
public class SQLDatePickerCellEditor extends DatePickerCellEditor {
public SQLDatePickerCellEditor(DateFormat dateFormat) {
super(dateFormat);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JXDatePicker picker = (JXDatePicker) super.getTableCellEditorComponent(table, value, isSelected, row, column);
picker.getEditor().setText(value.toString());
System.out.println(picker.getDate()); //this prints the correct date but for some reason at 00:00:00
return picker;
}
}
Вот пример кода для работы:
public class DateForm extends javax.swing.JFrame {
public DateForm() {
initComponents();
pack();
setLocationRelativeTo(null);
initModel();
}
public void initModel() {
Class<?>[] types = new Class<?>[]{String.class, String.class, Date.class};
Object[][] data = new Object[][]{
{"John", "Smith", new Date(System.currentTimeMillis())}
};
DefaultTableModel model = new DefaultTableModel(data, new String[]{"Name", "Surname", "Date"}) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return types[columnIndex];
}
};
table.setModel(model);
table.getColumn(2).setCellEditor(new DatePickerCellEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")));
StringValue sv = new FormatStringValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
TableCellRenderer r = new DefaultTableRenderer(sv);
table.getColumn(2).setCellRenderer(r);
}
@SuppressWarnings("unchecked")
private void initComponents() {
scrPane = new javax.swing.JScrollPane();
table = new org.jdesktop.swingx.JXTable();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setPreferredSize(new java.awt.Dimension(500, 500));
scrPane.setViewportView(table);
getContentPane().add(scrPane, java.awt.BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DateForm df = new DateForm();
df.setVisible(true);
}
});
}
private javax.swing.JScrollPane scrPane;
private org.jdesktop.swingx.JXTable table;
}
Это поведение предназначено? Я знаю, что JXDatePicker
предназначен только для дат, но я, естественно, предположил, что он сохранит время, пока пользователь не изменит дату.
String
, но редактор может ожидать значениеDate
- person MadProgrammer   schedule 11.01.2018Object
и присвоил емуDate
в качестве третьего значения, но поведение осталось точно таким же. В любом случае, для полноты картины я только что обновил пример кода, чтобы отразить это изменение. - person Morgan   schedule 11.01.2018