Campo data em Jtable

Alguem pelo amor de Deus tem um exemplo de Data com mascara em uma JTABLE ? Ta foda achar alguma coisa :S

Principalmente com exemplode CellEditor :s

Eu consegui fazer este modelo

package model.tablemodel;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.table.AbstractTableModel;

public class DemostrativoTableModel extends AbstractTableModel {

	private static final long serialVersionUID = 1L;
	private int rows; 
	private Object[][] dados;
	
	public DemostrativoTableModel(int rows, Object[][] dados){
		this.rows = rows;
		if(dados == null)
			this.dados = new Object[rows][11];
		else
			 this.dados = dados;
	}

    public int getColumnCount() {  
        return 11;
    }

    public String getColumnName(int coluna) {    
       switch(coluna){  
         case  0:return  "Taxa de Juros";  
         case  1:return  "Vencto.";  
         case  2:return  "Garantia";  
         case  3:return  "Valor Contratado";  
         case  4:return  "Saldo Atual"; 
         case  5:return  "Valores Vencidos"; 
         case  6:return  "A vencer Curto Prazo"; 
         case  7:return  "A vencer Longo Prazo"; 
         case  8:return  "PMT"; 
         case  9:return  "Destinação"; 
         case  10:return "Observações"; 
         default:return "";  
       }  
    } 

    public int getRowCount() {
		return rows;
	}

    public Class<?> getColumnClass(int col) {
    	switch(col){
	    	case  0:return Double.class;    
	    	case  1:return Date.class;  
	    	case  2:return Double.class;  
	    	case  3:return Double.class;  
	    	case  4:return Double.class;
	    	case  5:return Double.class;
	    	case  6:return Double.class; 
	    	case  7:return Double.class; 
	    	case  8:return Double.class;
	    	case  9:return Double.class;
	    	case 10:return Double.class;
	    	default:return Object.class;  
		}  
	}

	public Object getValueAt(int row, int col) {
			switch(col){
			case 0:return dados[row][col];
			case 1:return dados[row][col];
			case 2:return dados[row][col];
			case 3:return dados[row][col];
			case 4:return dados[row][col];
			case 5:return dados[row][col];
			case 6:return dados[row][col];
			case 7:return dados[row][col];
			case 8:return dados[row][col];
			case 9:return dados[row][col];
			case 10:return dados[row][col];
	    	default:return null;
		}
	}

	public void setValueAt(Object value, int row, int column) {
		if(value !=  null)
			
			if(!(column==1)){
				dados[row][column] = Double.parseDouble(value.toString());
			}
		
			if(column==1){
					dados[row][column] = converteData(value.toString());
			}
		
		else
			dados[row][column] = null;
			
		fireTableCellUpdated(row,column);
	}

	public boolean isCellEditable(int row, int col) {  
		return true;
	}

	public Date converteData(String dataString){
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
		Date date = null;
		if(!(dataString==null)){
			try {
				date = (Date)formatter.parse(dataString);
			} catch (ParseException e) {
				e.printStackTrace();
			}  
		}
		return date;
	}
	

} 

com este RENDERER:

package model.tablemodel;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.SoftBevelBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.text.MaskFormatter;

public class DemostrativoCellRenderer extends DefaultTableCellRenderer{

	private NumberFormat formatter;
	
	public Component getTableCellRendererComponent(JTable table, Object value,
                 boolean isSelected, boolean hasFocus, int row, int column) {
		
		setFont(new java.awt.Font("Lucida Sans", 0, 12 ));  
	 	setBorder(new SoftBevelBorder(SoftBevelBorder.RAISED));
	    setBackground(new Color(244, 242, 228));

	 	if (hasFocus)
	 			setBackground(new Color(230,230,250));
	 	
	    if(value != null){
		 	if(column==0){
			 	formatter = NumberFormat.getPercentInstance();
			 	formatter.setMaximumIntegerDigits(1);
	    		formatter.setMaximumFractionDigits(2);
	    		setText(formatter.format(value));
	    		setHorizontalAlignment(SwingConstants.CENTER);
		 	}else if(column==1){
		 		DateFormat formatter  = DateFormat.getDateInstance();
		 		setText(formatter.format(value) );
		    }else{
		 		
			 	formatter = NumberFormat.getCurrencyInstance();
	    		formatter.setMaximumFractionDigits(2);
	    		setText(formatter.format(value));
	    		setFont(new Font("helvetica",Font.ROMAN_BASELINE,11));
	    		setHorizontalAlignment(SwingConstants.RIGHT);
		 	}
    	}else{
    		setText("");   
    	} 
	    
	    
    	
	    return this;
	}

}



Meu metodo que cria a tabela é este :

	public void criarTabelas(JPanel painelConteudo, List<DemostrativoTableModel> listDemostrativoTableModel
			, Double dadosTabela[][], int contadorCredora){
		
		Object teste[][]= null;
		Dimension tamanhoTabela = new Dimension(1102,118);
		Dimension tamanhoLabel 	= new Dimension(100,20);
		JFormattedTextField campoData = null;
		//Maskaras
	
		DateFormat formatter  = DateFormat.getDateInstance();
		
		try {
			MaskFormatter maskData = new MaskFormatter("##/##/####");
			maskData.setPlaceholderCharacter('_');

			campoData = new JFormattedTextField(maskData);  
			campoData.setBorder(BorderFactory.createLineBorder(Color.BLACK));
			 
		} catch (ParseException e) {
			e.printStackTrace();
		} 
		
		
		JLabel txtInstCredora = new JLabel("Inst. Credora"+contadorCredora);
		txtInstCredora.setPreferredSize(tamanhoLabel);
		txtInstCredora.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		
		DemostrativoTableModel demostrativoTableModel = new DemostrativoTableModel(5, teste);
		
		listDemostrativoTableModel.add(demostrativoTableModel);
	    
		JTable tabela = new JTable(demostrativoTableModel);
		
		
	     TableColumn col = tabela.getColumnModel().getColumn(1);  
	     					col.setCellEditor(new DefaultCellEditor(campoData)); 
	
	    JTableHeader header = tabela.getTableHeader();
	    header.setFont(new Font("helvetica",Font.BOLD,12));
	    
	    tabela.setIntercellSpacing(new Dimension(0,0));
	    tabela.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	    tabela.getTableHeader().setReorderingAllowed(false);
	    tabela.getTableHeader().setResizingAllowed(false);

	    DemostrativoCellRenderer demostrativoCellRenderer = new DemostrativoCellRenderer();
	    
	    for (int j = 0; j < 11; j++){
			tabela.getColumnModel().getColumn(j).setPreferredWidth(100);
			tabela.setDefaultRenderer(tabela.getColumnClass(j),demostrativoCellRenderer);
		}
	    tabela.setRowHeight(20);//tamanho das linhas da tabela
	   
	    JScrollPane tabelaFinal = new JScrollPane(tabela);
	    tabelaFinal.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
	    tabelaFinal.setPreferredSize(tamanhoTabela);
	    
	    
	    tabelaFinal.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
	    painelConteudo.add(txtInstCredora);
	    painelConteudo.add(tabelaFinal);
	    painelConteudo.updateUI();
	}

O que está acontecendo ?

Tipo a minha segunda coluna é o meu campo DATA, quando eu digito uma data certinho ele fica tudo OK e tal, porem quando eu coloco uma data tipo 99/99/9999 ele aceita e coloca uma data estranha…

Como eu posso arrumar isto ?Eu queria tb que a celula trava-se quando a data tiver errada :s

[code]
seu metodo data faz ele retornar o seguinte

Calendar cal = new GregorianCalendar();

    cal.setTime(gregorinancalendar.getTime());

    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    
    return new teusimpledateformat.(cal.getTime());/[/code]