Hola:
Estoy empezando a utilizar JTable, uso una para mostrar unos datos almacenados en una BD, y una de las columnas contiene fechas. A la hora de modificar una fecha, quiero que aparezca un calendario que permita seleccionar el nuevo valor, para ello he creado un editor específico. Al seleccionar la fecha y modificarla parece que va todo bien, pero al seleccionar otra celda, la que había sido modificada vuelve a su valor actual. Adjunto el código del render y del editor de la celda a ver si alguien puede echarme una mano.
Editor:
Código:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import calendario.*;
public class EditorFecha extends JButton implements TableCellEditor
{
private Fecha fechaActual = null;
private boolean editable;
private boolean edicionFinalizada;
public EditorFecha(boolean editable)
{
super("");
this.editable = editable;
this.setBorderPainted(false);
this.setMargin(new Insets(0,0,0,0));
ActionListener okListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
mostrarVentana();
}
};
this.addActionListener(okListener);
}
public Component getTableCellEditorComponent(JTable tabla, Object valor, boolean isSelected, int fila, int columna)
{
this.setBackground(tabla.getBackground());
fechaActual = (Fecha) valor;
this.setText(fechaActual.getFecha());
return this;
}
public Object getCellEditorValue()
{
return fechaActual;
}
public boolean isCellEditable(EventObject e)
{
return editable;
}
public boolean shouldSelectCell(EventObject e)
{
return true; //La celda que está siendo editada debe estar seleccionada
}
public boolean stopCellEditing()
{
return edicionFinalizada;
}
public void cancelCellEditing()
{}
public void addCellEditorListener(CellEditorListener cel)
{}
public void removeCellEditorListener(CellEditorListener cel)
{}
public void setCellEditable(boolean editable)
{
this.editable = editable;
}
private void setEdicionFinalizada()
{
edicionFinalizada = true;
}
private void establecerFecha(String fecha)
{
fechaActual = new Fecha(fecha);
this.setText(fecha);
}
private void mostrarVentana()
{
edicionFinalizada = false;
final Calendario calendario = new Calendario();
final JFrame ventana = new JFrame("Seleccione una fecha");
JPanel botonera = new JPanel();
JButton aceptarB = new JButton("Aceptar");
JButton cancelarB = new JButton("Cancelar");
JLabel espacio = new JLabel("");
ActionListener aceptarListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
establecerFecha(calendario.getFecha());
setEdicionFinalizada();
ventana.dispose();
}
};
aceptarB.addActionListener(aceptarListener);
ActionListener cancelarListener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setEdicionFinalizada();
ventana.dispose();
}
};
cancelarB.addActionListener(cancelarListener);
espacio.setPreferredSize(new Dimension(80, 0));
botonera.add(cancelarB, null);
botonera.add(espacio, null);
botonera.add(aceptarB, null);
ventana.getContentPane().setLayout(new BorderLayout());
ventana.getContentPane().add(calendario, BorderLayout.CENTER);
ventana.getContentPane().add(botonera, BorderLayout.SOUTH);
ventana.setSize(400, 200);
ventana.setVisible(true);
}
}
Render:
Código:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class RenderFecha extends DefaultTableCellRenderer implements TableCellRenderer
{
public RenderFecha()
{
super();
}
public Component getTableCellRendererComponent(JTable tabla, Object valor, boolean isSelected, boolean hasFocus, int fila, int columna)
{
Color amarillo = new Color(255, 255, 185);
if (valor != null)
this.setText(((Fecha)valor).getFecha());
else
this.setText("");
setHorizontalAlignment(CENTER);
setOpaque(true);
if (isSelected || hasFocus)
this.setBackground(amarillo);
else
this.setBackground(SystemColor.control);
return this;
}
}
Muchas gracias por adelantado.
Saludos