【问题标题】:JTable Column not editable after custom renderer自定义渲染器后 JTable 列不可编辑
【发布时间】:2013-01-30 00:22:56
【问题描述】:

这是对here 发布的问题的后续处理。

我已按照答案中的说明进行操作,效果很好。但是,无法编辑日期列:我无法在填充的表格中选择任何 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 方法,以便将单元格设置为可编辑或不可编辑。关于如何解决这个问题的任何想法,或者我做错了什么?

任何帮助将不胜感激。

【问题讨论】:

    标签: java swing jtable jcalendar jdatechooser


    【解决方案1】:

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

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

    Date.class类型的模型值指定默认的editor

    @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();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2015-01-27
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多