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.
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
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();
}
}
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;
}