Я хочу поделиться чем-то, что я только что написал для своего проекта, мне пришлось создать простой и быстрый редактор дат для JTable, который может редактировать на месте, его также можно использовать как обычный элемент управления.
Как вы видите, формат даты можно изменить, изменив порядок строки, используемой в SimpleDateFormat, но не забудьте переключить массив диапазонов.
Вот код:
public class DateControl extends JPanel {
@SuppressWarnings("unchecked")
private JComboBox<String>[] combos = new JComboBox[3];
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
final int ranges[][] = {{2012,2050},{1,12},{1,31}};
public DateControl() {
super();
combos[0] = new JComboBox<String>();
combos[1] = new JComboBox<String>();
combos[2] = new JComboBox<String>();
// Fill the combos
for (int i = 0; i<combos.length; i++)
for (int j = ranges[i][0]; j<ranges[i][1]; j++)
combos[i].addItem((j<9?"0":"")+Integer.toString(j));
this.setLayout(new BoxLayout(this,BoxLayout.X_AXIS));
for (JComboBox<String> c: combos) {
// Remove the arrow button from the combo boxes (optional)
c.setUI(new BasicComboBoxUI() {
protected JButton createArrowButton() {
return new JButton() {
public int getWidth() {
return 0;
}
};
}
});
this.add(c);
}
//This is just for a nice look touch (optional)
this.setBorder(BorderFactory.createRaisedBevelBorder());
// Set to today's date
setDate(new Date());
}
// Date argument constructor
public DateControl(Date date) {
this();
setDate(date);
}
public void setDate(Date d) {
String[] date = df.format(d).split("/");
for (int i=0;i<combos.length; i++)
combos[i].setSelectedItem(date[i]);
}
public Date getDate() {
String str = combos[0].getSelectedItem()+"/"+combos[1].getSelectedItem()+"/"+combos[2].getSelectedItem();
Date ret = null;
try {
ret = df.parse(str);
} catch (ParseException e) {e.printStackTrace();}
return ret;
}
}
затем его можно использовать в качестве редактора ячеек следующим образом:
class DateCellEditor extends AbstractCellEditor implements TableCellEditor {
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
private DateControl dateControl;
public DateCellEditor() {
dateControl = new DateControl();
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
Date d = new Date();
try {
Object str = table.getValueAt(row, column);
if (str!=null)
d = df.parse((String)str);
} catch (ParseException e) {
e.printStackTrace();
}
dateControl.setDate(d);
return dateControl;
}
@Override
public Object getCellEditorValue() {
return df.format(dateControl.getDate());
}
}
Новый редактор ячеек можно использовать в столбцах таблицы следующим образом:
TableColumn c = myTable.getColumnModel().getColumn(0);
c.setCellEditor(new DateCellEditor());
Я должен напомнить вам, что это ячейка «Редактор», она будет отображаться только тогда, когда ячейка находится под редакцией. Значение даты будет отображаться обычной ячейкой «Renderer» в виде простой строки в формате гггг / мм / дд.
Надеюсь, все это кому-нибудь поможет :)