自定义渲染器后JTable列无法编辑

这是此处发布的问题的后续跟进。

我按照答案中的说明操作,它就像一个魅力。 但是,无法编辑日期列:我无法在填充的表中选择任何JDateChooser

如前面的问题所述,我正在使用MVC模式。 当我从视图中填充JTablesetCellRenderer ,它工作正常。 只有当我从控制器填充并设置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方法,以便将单元格设置为可编辑或不可编辑。 关于如何解决这个问题的想法,或者我做错了什么?

任何帮助将不胜感激。

开始测试com.toedter.calendar.demo.DemoTable可能会有所帮助,如下所示。 注意该怎么行

 table.setDefaultEditor(Date.class, new JDateChooserCellEditor()); 

指定Date.class类型的模型值的默认编辑器 :

 @Override public Class getColumnClass(int c) { return getValueAt(0, 1).getClass(); } 

图片

 import com.toedter.calendar.demo.DemoTable; import java.awt.EventQueue; import java.awt.GridLayout; import javax.swing.JFrame; /** @see http://stackoverflow.com/a/14880675/230513 */ public class TableTest { private void display() { JFrame f = new JFrame("TableTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new DemoTable()); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new TableTest().display(); } }); } }