Java tutorial
import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import java.util.EventObject; import java.util.GregorianCalendar; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.EventListenerList; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; class GenderEditor extends JComboBox implements TableCellEditor { protected EventListenerList listenerList = new EventListenerList(); protected ChangeEvent changeEvent = new ChangeEvent(this); public GenderEditor() { super(); addItem("Male"); addItem("Female"); addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { fireEditingStopped(); } }); } public void addCellEditorListener(CellEditorListener listener) { listenerList.add(CellEditorListener.class, listener); } public void removeCellEditorListener(CellEditorListener listener) { listenerList.remove(CellEditorListener.class, listener); } protected void fireEditingStopped() { CellEditorListener listener; Object[] listeners = listenerList.getListenerList(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] == CellEditorListener.class) { listener = (CellEditorListener) listeners[i + 1]; listener.editingStopped(changeEvent); } } } protected void fireEditingCanceled() { CellEditorListener listener; Object[] listeners = listenerList.getListenerList(); for (int i = 0; i < listeners.length; i++) { if (listeners[i] == CellEditorListener.class) { listener = (CellEditorListener) listeners[i + 1]; listener.editingCanceled(changeEvent); } } } public void cancelCellEditing() { fireEditingCanceled(); } public boolean stopCellEditing() { fireEditingStopped(); return true; } public boolean isCellEditable(EventObject event) { return true; } public boolean shouldSelectCell(EventObject event) { return true; } public Object getCellEditorValue() { return new Boolean(getSelectedIndex() == 0 ? true : false); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { boolean isMale = ((Boolean) value).booleanValue(); setSelectedIndex(isMale ? 0 : 1); return this; } } public class TableCellEditorJComboBox extends JFrame { protected JTable table; public static void main(String[] args) { TableCellEditorJComboBox stt = new TableCellEditorJComboBox(); stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); stt.setSize(400, 200); stt.setVisible(true); } public TableCellEditorJComboBox() { Container pane = getContentPane(); pane.setLayout(new BorderLayout()); TableValues tv = new TableValues(); table = new JTable(tv); TableColumnModel tcm = table.getColumnModel(); TableColumn tc = tcm.getColumn(TableValues.GENDER); tc.setCellEditor(new GenderEditor()); JScrollPane jsp = new JScrollPane(table); pane.add(jsp, BorderLayout.CENTER); } } class TableValues extends AbstractTableModel { public final static int FIRST_NAME = 0; public final static int LAST_NAME = 1; public final static int DATE_OF_BIRTH = 2; public final static int ACCOUNT_BALANCE = 3; public final static int GENDER = 4; public final static boolean GENDER_MALE = true; public final static boolean GENDER_FEMALE = false; public Object[][] values = { { "C", "A", new GregorianCalendar(1962, Calendar.FEBRUARY, 20).getTime(), new Float(1.67), new Boolean(GENDER_MALE) }, { "J", "A", new GregorianCalendar(1987, Calendar.JANUARY, 6).getTime(), new Float(2.78), new Boolean(GENDER_MALE) }, { "J", "A", new GregorianCalendar(1989, Calendar.AUGUST, 31).getTime(), new Float(3.89), new Boolean(GENDER_FEMALE) }, { "E", "K", new GregorianCalendar(1945, Calendar.JANUARY, 16).getTime(), new Float(-4.70), new Boolean(GENDER_FEMALE) }, { "B", "S", new GregorianCalendar(1907, Calendar.AUGUST, 2).getTime(), new Float(5.00), new Boolean(GENDER_FEMALE) } }; public int getRowCount() { return values.length; } public boolean isCellEditable(int rowIndex, int columnIndex) { return true; } public int getColumnCount() { return values[0].length; } public Object getValueAt(int row, int column) { return values[row][column]; } }