JTable中列自定义渲染后无法编辑(JTable Column not editable afte

2019-07-19 21:27发布

这是一个后续张贴的问题在这里 。

我跟着答案的指示,和它的工作就像一个魅力。 然而,日期栏不能被编辑:我不能选择任何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方法,创建表的时候,为了设置细胞为可编辑与否。 关于如何去任何想法,或者是我做错了吗?

任何帮助将不胜感激。

Answer 1:

这可能有助于开始的测试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();
            }
        });
    }
}


文章来源: JTable Column not editable after custom renderer