Это ответ на вопрос, который был отправлен here.JTable Column не редактируется после пользовательского рендеринга
Я следовал инструкциям в ответе, и это сработало как шарм. Тем не менее, столбец даты не может быть отредактирован: я не могу выбрать JDateChooser
в заполненной таблице.
Как уже упоминалось в предыдущем вопросе, я использую шаблон MVC. Когда я заполняю JTable
и setCellRenderer
из представления, он отлично работает. Только когда я заполняю и setCellRenderer
с моего контроллера, что столбец даты не включен.
Вот рендер:
public class JDateChooserRenderer extends JDateChooser implements TableCellRenderer{
Date inDate;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// TODO Auto-generated method stub
if (value instanceof Date){
this.setDate((Date) value);
} else if (value instanceof Calendar){
this.setCalendar((Calendar) value);
}
this.setEnabled(true);
return this;
}
Вот код с моей точки зрения, которая работает:
scrollPanePermits = new JScrollPane();
tableVehiclePermitHeader = new String[] {"Name", "Expiration Date"};
tableVehiclePermitData = new Object[0][0];
Calendar tempDate = new GregorianCalendar(2008, 1, 1);
Date tempDate1 = new Date(2008, 1, 1);
tempDate1.setYear(tempDate1.getYear() - 1900);
tableVehiclePermitData = new Object [][] {{"Hello", tempDate}, {"Hello", tempDate1}};
tableVehiclePermitDefaultTableModel = new DefaultTableModel(tableVehiclePermitData, tableVehiclePermitHeader);
tableVehiclePermit = new JTable(tableVehiclePermitDefaultTableModel){
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int colIndex){
if (colIndex == 0){
return false;
} else {
return true;
}
}
};
tableVehiclePermit.getColumn("Expiration Date").setCellRenderer(new JDateChooserRenderer());
tableVehiclePermit.getColumn("Expiration Date").setCellEditor(new JDateChooserCellEditor());
Наконец, это код из моего контроллера, который заполняет таблицу, но дата колонка не подлежит редактированию:
permitListData = new Object[vehPermit.size()][3];
Iterator it = vehPermit.iterator();
int i = 0;
while (it.hasNext()){
permitData = (VehiclePermitExpirationByVehicleDao) it.next();
permitListData[i][0] = permitData.getVehiclePermitName();
permitListData[i][1] = permitData.getExpirationDate();
permitListData[i][2] = permitData.getVehiclePermitId();
i++;
}
gui.setTableVehiclePermitData(permitListData);
gui.getTableVehiclePermitDefaultTableModel().setDataVector(gui.getTableVehiclePermitData(), gui.getTableVehiclePermitHeader());
gui.getTableVehiclePermit().setModel(gui.getTableVehiclePermitDefaultTableModel());
// TableColumn dateColumn = gui.getTableVehiclePermit().getColumnModel().getColumn(1);
// dateColumn.setCellRenderer(new JDateChooserRenderer());
gui.getTableVehiclePermit().getColumn("Expiration Date").setCellRenderer(new JDateChooserRenderer());
gui.getTableVehiclePermit().setEnabled(true);
где gui - это экземпляр моего представления.
Я знаю только о переопределении метода isCellEditable при создании таблицы, чтобы установить ячейки как редактируемые или нет. Любые идеи о том, как это сделать, или о том, что я делаю неправильно?
Любая помощь была бы принята с благодарностью.