Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con editor en una JTable

Estas en el tema de Problema con editor en una JTable en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 04/02/2004, 05:37
 
Fecha de Ingreso: diciembre-2003
Mensajes: 34
Antigüedad: 20 años, 5 meses
Puntos: 0
Problema con editor en una JTable

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

Última edición por Mabrev; 04/02/2004 a las 06:51
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:09.