Java 自定义渲染器后JTable列不可编辑
这是对发布的问题的跟进 我按照答案中的说明做了,效果很好。但是,无法编辑日期列:我无法在填充的表中选择任何Java 自定义渲染器后JTable列不可编辑,java,swing,jtable,jcalendar,jdatechooser,Java,Swing,Jtable,Jcalendar,Jdatechooser,这是对发布的问题的跟进 我按照答案中的说明做了,效果很好。但是,无法编辑日期列:我无法在填充的表中选择任何JDateChooser 如前一个问题所述,我使用的是MVC模式。当我从视图中填充JTable和setCellRenderer时,它工作正常。只有当我从控制器中填充并setCellRenderer时,日期列才未启用 以下是渲染器: public class JDateChooserRenderer extends JDateChooser implements TableCellRender
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方法,以便将单元格设置为可编辑或不可编辑。你知道怎么做吗,或者我做错了什么
任何帮助都将不胜感激。从测试
com.toedter.calendar.demo.demovable开始可能会有所帮助,如下所示。请注意该行是如何显示的
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();
}
});
}
}