Question

I want to add a JDateChooser inside a JTable Cell. I know how to add a textbox, combobox and checkbox.

I allow the user to enter data to the table. The user should be able to select a date for every row.

Any help would be appreciated.
Thank you

Was it helpful?

Solution

Read the section from the Swing tutorial on Using Other Editors.

It shows how to create a custom editor using JColorChooser. I would guess the code would be similiar for using a JDateChooser.

OTHER TIPS

Set the CellEditor as following:

table.getColumnModel().getColumn(1).setCellEditor(new JDateChooserEditor(new JCheckBox()));

/*************************************************************************/

Here is the code for JDateChooserEditor:

class JDateChooserEditor extends DefaultCellEditor
{
  public JDateChooserEditor(JCheckBox checkBox)
  {
    super(checkBox);

  }

  JDateChooser date;
  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) 
  {

         date = new JDateChooser();
         date.setDateFormatString("dd-MM-yyyy");
         return date;
  }

  public Object getCellEditorValue() 
  {
    return new String(((JTextField)date.getDateEditor().getUiComponent()).getText());
  }

  public boolean stopCellEditing()
  {
    return super.stopCellEditing();
  }

  protected void fireEditingStopped() {
    super.fireEditingStopped();
  }
}

Screen Shot

This is a final solution for everyone, enjoy!!:


import com.toedter.calendar.JDateChooser;
import com.toedter.calendar.JTextFieldDateEditor;
import java.awt.Component;
import java.util.Calendar;
import java.util.Date;
import static javax.swing.BorderFactory.createEmptyBorder;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Sergio
 */
public final class JDateChooserRenderer extends JDateChooser 
                                  implements TableCellRenderer  
{
    public JDateChooserRenderer() {                
        initilizie();
    }

    public void initilizie(){
        this.setPreferredSize(new java.awt.Dimension(50, 30));                 
        this.setDateFormatString("dd/MM/yyyy");
        this.setBorder(createEmptyBorder());    
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected, boolean hasFocus,
                                                   int row, int column) {        
        // Configure text Editor
        JTextFieldDateEditor textEditor = (JTextFieldDateEditor) getDateEditor().getUiComponent();        
        textEditor.setBorder(createEmptyBorder());

        if (isSelected) {        
            textEditor.setBackground(table.getSelectionBackground()); 
        }   else {            
            textEditor.getUiComponent().setBackground(table.getBackground());
        }   

        if (value instanceof Date){
            this.setDate((Date) value);
        } else if (value instanceof Calendar){
            this.setCalendar((Calendar) value);
        }
        return this;        
    }
 }

import com.toedter.calendar.JDateChooser;
import com.toedter.calendar.JTextFieldDateEditor;
import javax.swing.AbstractCellEditor;
import javax.swing.table.TableCellEditor;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Calendar;
import java.awt.Component;
import javax.swing.JTable;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import static javax.swing.BorderFactory.createEmptyBorder;
import javax.swing.border.Border;

/**
 *
 * @author Sergio 
 */
public class JDateChooserEditor extends AbstractCellEditor
        implements TableCellEditor, PropertyChangeListener {

    JDateChooser DateChooser;
    Calendar calendar;  
    Border unselectedBorder = null;
    JTextFieldDateEditor textEditor = null;

    public JDateChooserEditor() {            
        DateChooser = new JDateChooser();         
        calendar = Calendar.getInstance();
        DateChooser.setPreferredSize(new java.awt.Dimension(50, 35));        
        DateChooser.setDateFormatString("dd/MM/yyyy"); 
        DateChooser.setCalendar(Calendar.getInstance());         
        // Configure text Editor
        textEditor = (JTextFieldDateEditor) DateChooser.getDateEditor().getUiComponent();        
        textEditor.setBorder(createEmptyBorder());
        // Listen for property changes
        DateChooser.addPropertyChangeListener(this);                          
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        // If the 'date' property was changed...           
        if ("date".equals(evt.getPropertyName())) {
            JDateChooser edateChooser = (JDateChooser) evt.getSource();
            boolean isDateSelectedByUser = false;
            // Get the otherwise unaccessible JDateChooser's 'dateSelected' field.
            Field dateSelectedField = null;
            try {
                // Get the desired field using reflection
                dateSelectedField = JDateChooser.class.getDeclaredField("dateSelected");
                // This line makes the value accesible (can be read and/or modified)
                if (dateSelectedField != null) {
                    dateSelectedField.setAccessible(true);                    
                    isDateSelectedByUser = dateSelectedField.getBoolean(edateChooser);

                    if (isDateSelectedByUser) {
                        calendar = (Calendar) edateChooser.getCalendar();                                                                                                
                        DateChooser.setCalendar(calendar);                              
                    }                 
                }                 
                fireEditingStopped();                
            } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException ex) {
                Logger.getLogger(JDateChooserEditor.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    // Se implementa el método CellEditor de la clase abstracta AbstractCellEditor.    
    @Override
    public Object getCellEditorValue() {       
       return calendar;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected,int row, int column) {               
        DateChooser.getDateEditor().getUiComponent().setBackground(table.getSelectionBackground());         
        if (value instanceof Date){
            calendar.setTime((Date) value);             
        } else if (value instanceof Calendar){
            calendar = (Calendar) value;
        };  
        DateChooser.setCalendar(calendar);
        return DateChooser;
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top