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.