Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
253 views
in Technique[技术] by (71.8m points)

java - JTable Column not editable after custom renderer

This is a follow up to the question posted here.

I've followed the instructions in the answer, and it worked like a charm. However, the date column cannot be edited: I cannot select any JDateChooser within the populated table.

As mentioned in the earlier question, I'm using an MVC pattern. When I populate the JTable and setCellRenderer from within the view, it works fine. It is only when I populate and setCellRenderer from my controller that the date column isn't enabled.

Here is the renderer:

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;
}

Here is the code from my view which works:

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

Finally, this is the code from my controller that populates the table, but the date column is not editable:

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);

where gui is an instance of my view.

I only know of overriding the isCellEditable method, when creating the table, in order to set cells as editable or not. Any ideas on how to go about this, or what I'm doing wrong?

Any help would be greatly appreciated.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It might help to start with a test of com.toedter.calendar.demo.DemoTable, shown below. Note how the line

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

specifies the default editor for model values of type Date.class:

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

image

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...