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:
Render: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); } }
Código:
Muchas gracias por adelantado.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; } }
Saludos