Leyendo al página de Chiudiang acerca de los editores de celdas,´diseñé un editor para fechas. La clase sería la siguiente:
Código:
Le asigno el EditorDeFechas a la tabla de la siguiente manera:import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.EventObject;
import java.util.LinkedList;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
public class EditorDeFechas extends JTextField implements TableCellEditor {
final SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
private String fecha = null;
private LinkedList suscriptores = new LinkedList();
public EditorDeFechas() {
super();
this.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent evento) {
editado(true);
}
});
this.addFocusListener(new java.awt.event.FocusAdapter() {
@Override
public void focusGained(java.awt.event.FocusEvent evt) {
FocusGained(evt);
}
@Override
public void focusLost(java.awt.event.FocusEvent evt) {
FocusLost(evt);
}
});
}
private void FocusGained(java.awt.event.FocusEvent evt) {
this.selectAll();
}
private void FocusLost(java.awt.event.FocusEvent evt) {
editado(false);
}
public Component getTableCellEditorComponent(JTable tabla, Object valor, boolean isSelected, int fila, int columna) {
//fecha = (valor == null) ? "" : formato.format(valor);
if (valor instanceof Date){
fecha = formato.format((Date)valor);
} else {
fecha="";
}
this.setText(fecha);
return this;
}
@Override
public void cancelCellEditing() {
}
@Override
public boolean shouldSelectCell(EventObject e) {
return true;
}
public Object getCellEditorValue() {
return fecha;
}
@Override
public boolean isCellEditable(EventObject e) {
return true;
}
@Override
public boolean stopCellEditing() {
/*
String unaFecha = campo.getText();
formato.setLenient(false);
try {
formato.parse(unaFecha.trim());
return true;
} catch (ParseException pe) {
ExceptionManager ex=new ExceptionManager();
ex.setErrorDeNegocio("Fecha no Válida");
ex.setErrorTecnico(pe.getMessage());
JOptionPane.showMessageDialog(null, ex.getErrorDeNegocio(), ex.getErrorTecnico(), JOptionPane.ERROR_MESSAGE);
return false;
}
*
*/
return true;
}
protected void editado(boolean cambiado) {
ChangeEvent evento = new ChangeEvent (this);
int i;
for (i=0; i<suscriptores.size(); i++) {
CellEditorListener aux = (CellEditorListener) suscriptores.get(i);
if (cambiado)
aux.editingStopped(evento);
else
aux.editingCanceled(evento);
}
}
@Override
public void addCellEditorListener(CellEditorListener l) {
suscriptores.add (l);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
suscriptores.remove(l);
}
}
Código:
El problema que tengo es que al editar la fecha, cambiarla por otra y darle enter, no me toma el valor nuevo sino que me deja el anterior.tabla.setDefaultEditor(Date.class, new EditorDeFechas());
Alguien podría hecharle un vistazo al EditorDeFechas para ver qué estoy haciendo mal?
Desde ya muchas gracias.


