• Martes 5 de Noviembre de 2024, 23:38

Autor Tema:  Problema Al Establecer Un Editor En Una Jtable  (Leído 4160 veces)

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Problema Al Establecer Un Editor En Una Jtable
« en: Martes 3 de Febrero de 2004, 14:58 »
0
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: Text
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. import javax.swing.*;
  5. import javax.swing.event.*;
  6. import javax.swing.table.*;
  7. import calendario.*;
  8.  
  9.  
  10. public class EditorFecha extends JButton implements TableCellEditor
  11.   {
  12.   private Fecha fechaActual = null;
  13.   private boolean editable;
  14.   private boolean edicionFinalizada;
  15.  
  16.   public EditorFecha(boolean editable)
  17.     {
  18.     super("");
  19.     this.editable = editable;
  20.     this.setBorderPainted(false);
  21.     this.setMargin(new Insets(0,0,0,0));
  22.     ActionListener okListener = new ActionListener()
  23.       {
  24.       public void actionPerformed(ActionEvent e)
  25.         {
  26.         mostrarVentana();
  27.         }
  28.       };
  29.     this.addActionListener(okListener);
  30.     }
  31.  
  32.   public Component getTableCellEditorComponent(JTable tabla, Object valor, boolean isSelected, int fila, int columna)
  33.     {
  34.     this.setBackground(tabla.getBackground());
  35.     fechaActual = (Fecha) valor;
  36.     this.setText(fechaActual.getFecha());
  37.  
  38.     return this;
  39.     }
  40.  
  41.   public Object getCellEditorValue()
  42.     {
  43.     return fechaActual;
  44.     }
  45.  
  46.   public boolean isCellEditable(EventObject e)
  47.     {
  48.     return editable;
  49.     }
  50.  
  51.   public boolean shouldSelectCell(EventObject e)
  52.     {
  53.     return true;  //La celda que está siendo editada debe estar seleccionada
  54.     }
  55.  
  56.   public boolean stopCellEditing()
  57.     {
  58.     return edicionFinalizada;
  59.     }
  60.  
  61.   public void cancelCellEditing()
  62.     {}
  63.  
  64.   public void addCellEditorListener(CellEditorListener cel)
  65.     {}
  66.  
  67.   public void removeCellEditorListener(CellEditorListener cel)
  68.     {}
  69.  
  70.   public void setCellEditable(boolean editable)
  71.     {
  72.     this.editable = editable;
  73.     }
  74.  
  75.   private void setEdicionFinalizada()
  76.     {
  77.     edicionFinalizada = true;
  78.     }
  79.  
  80.   private void establecerFecha(String fecha)
  81.     {
  82.     fechaActual = new Fecha(fecha);
  83.     this.setText(fecha);
  84.     }
  85.  
  86.   private void mostrarVentana()
  87.     {
  88.     edicionFinalizada = false;
  89.     final Calendario calendario = new Calendario();
  90.     final JFrame ventana = new JFrame("Seleccione una fecha");
  91.     JPanel botonera = new JPanel();
  92.     JButton aceptarB = new JButton("Aceptar");
  93.     JButton cancelarB = new JButton("Cancelar");
  94.     JLabel espacio = new JLabel("");
  95.  
  96.     ActionListener aceptarListener = new ActionListener()
  97.       {
  98.       public void actionPerformed(ActionEvent e)
  99.        {
  100.        establecerFecha(calendario.getFecha());
  101.        setEdicionFinalizada();
  102.        ventana.dispose();
  103.        }
  104.      };
  105.     aceptarB.addActionListener(aceptarListener);
  106.  
  107.     ActionListener cancelarListener = new ActionListener()
  108.       {
  109.       public void actionPerformed(ActionEvent e)
  110.        {
  111.        setEdicionFinalizada();
  112.        ventana.dispose();
  113.        }
  114.      };
  115.     cancelarB.addActionListener(cancelarListener);
  116.  
  117.     espacio.setPreferredSize(new Dimension(80, 0));
  118.  
  119.     botonera.add(cancelarB, null);
  120.     botonera.add(espacio, null);
  121.     botonera.add(aceptarB, null);
  122.  
  123.     ventana.getContentPane().setLayout(new BorderLayout());
  124.     ventana.getContentPane().add(calendario, BorderLayout.CENTER);
  125.     ventana.getContentPane().add(botonera, BorderLayout.SOUTH);
  126.     ventana.setSize(400, 200);
  127.     ventana.setVisible(true);
  128.     }
  129.   }
  130.  

Render:
Código: Text
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import javax.swing.table.*;
  5.  
  6. public class RenderFecha extends DefaultTableCellRenderer implements TableCellRenderer
  7.   {
  8.   public RenderFecha()
  9.     {
  10.     super();
  11.     }
  12.  
  13.   public Component getTableCellRendererComponent(JTable tabla, Object valor, boolean isSelected, boolean hasFocus, int fila, int columna)
  14.     {
  15.     Color amarillo = new Color(255, 255, 185);
  16.     if (valor != null)
  17.      this.setText(((Fecha)valor).getFecha());
  18.     else
  19.      this.setText("");
  20.     setHorizontalAlignment(CENTER);
  21.     setOpaque(true);
  22.     if (isSelected || hasFocus)
  23.      this.setBackground(amarillo);
  24.     else
  25.      this.setBackground(SystemColor.control);
  26.  
  27.     return this;
  28.     }
  29.   }
  30.  

Muchas gracias por adelantado.

Saludos

gothmog

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Problema Al Establecer Un Editor En Una Jtable
« Respuesta #1 en: Miércoles 4 de Febrero de 2004, 17:26 »
0
La causa aparente es que no toma el objeto del celleditor como objeto del cellrenderer. Si, suena raro. Vaya por delante que no domino mucho del tema, solo espero no estar diciendo ninguna barbaridad  ;)

Cuando asocias el cellRenderer, el modelo asocia ese objeto con la columna. Por ejemplo, en este caso, es un JTextField. Al llamar al cellEditor, crea un objeto nuevo "encima" del JTextField, pero cuando vuelves a llamar al cellEditor desde otra fila, ese objeto se destruye, quedando el cellRenderer que no se ha modificado en ningun momento. Haz una prueba. Mete un boton que te diga el contenido de una celda determinada que utilice el cellEditor. Ahora cambia el valor, y pulsa el boton. Veras que el contenido de la celda no ha cambiado.

Espero que te sirva de ayuda  :rolleyes:

Ah, por cierto, en el renderFecha, si estas extendiendo un cellRenderer, no hace ya falta que implementes el generico ;)

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: Problema Al Establecer Un Editor En Una Jtable
« Respuesta #2 en: Miércoles 4 de Febrero de 2004, 22:06 »
0
Muchas gracias por el consejo, voy a probarlo y ya te comentaré.

Saludos

mabrev

  • Miembro MUY activo
  • ***
  • Mensajes: 126
    • Ver Perfil
Re: Problema Al Establecer Un Editor En Una Jtable
« Respuesta #3 en: Jueves 5 de Febrero de 2004, 20:22 »
0
Hola:

Al fin lo he conseguido.  El problema estaba en que el editor no le comunicaba a la JTable que había finalizado la edición, así que sin retornar el valor, lo cancelaba y comenzaba con la edición de la siguiente celda. Así que para que el editor funcione hay que implementar los metodos de añadir CellEditorListener y avisar a los sucriptores cuando se termine la edicion.

Saludos y muchas gracias por la ayuda.

gothmog

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Problema Al Establecer Un Editor En Una Jtable
« Respuesta #4 en: Viernes 6 de Febrero de 2004, 00:24 »
0
Vaya, vista la solucion parece evidente. Es lo malo de usar programas como jbuilder, que a veces se te olvidan cosas tan basicas como los listeners  :P

jamir295

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Problema Al Establecer Un Editor En Una Jtable
« Respuesta #5 en: Jueves 3 de Septiembre de 2009, 22:11 »
0
espero que no sea molestia para ti, pero quisiera que muestres las clases que has usado de "import calendario.*:" asi como mostraste las otras clases. te lo agradeceria . :D