Swing Components Java

// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/* (swing1.1beta3) */
import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.EventObject;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.CellEditorListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
/**
 * @version 1.0 11/09/98
 */
class ComboString {
  String str;
  ComboString(String str) {
    this.str = str;
  }
  public String toString() {
    return str;
  }
}
class MultiRenderer extends DefaultTableCellRenderer {
  JCheckBox checkBox = new JCheckBox();
  public Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) {
    if (value instanceof Boolean) { // Boolean
      checkBox.setSelected(((Boolean) value).booleanValue());
      checkBox.setHorizontalAlignment(JLabel.CENTER);
      return checkBox;
    }
    String str = (value == null) ? "" : value.toString();
    return super.getTableCellRendererComponent(table, str, isSelected,
        hasFocus, row, column);
  }
}
class MultiEditor implements TableCellEditor {
  private final static int COMBO = 0;
  private final static int BOOLEAN = 1;
  private final static int STRING = 2;
  private final static int NUM_EDITOR = 3;
  DefaultCellEditor[] cellEditors;
  JComboBox comboBox;
  int flg;
  public MultiEditor() {
    cellEditors = new DefaultCellEditor[NUM_EDITOR];
    comboBox = new JComboBox();
    comboBox.addItem("true");
    comboBox.addItem("false");
    cellEditors[COMBO] = new DefaultCellEditor(comboBox);
    JCheckBox checkBox = new JCheckBox();
    //checkBox.setOpaque( true );
    checkBox.setHorizontalAlignment(JLabel.CENTER);
    cellEditors[BOOLEAN] = new DefaultCellEditor(checkBox);
    JTextField textField = new JTextField();
    cellEditors[STRING] = new DefaultCellEditor(textField);
    flg = NUM_EDITOR; // nobody
  }
  public Component getTableCellEditorComponent(JTable table, Object value,
      boolean isSelected, int row, int column) {
    if (value instanceof ComboString) { // ComboString
      flg = COMBO;
      String str = (value == null) ? "" : value.toString();
      return cellEditors[COMBO].getTableCellEditorComponent(table, str,
          isSelected, row, column);
    } else if (value instanceof Boolean) { // Boolean
      flg = BOOLEAN;
      return cellEditors[BOOLEAN].getTableCellEditorComponent(table,
          value, isSelected, row, column);
    } else if (value instanceof String) { // String
      flg = STRING;
      return cellEditors[STRING].getTableCellEditorComponent(table,
          value, isSelected, row, column);
    }
    return null;
  }
  public Object getCellEditorValue() {
    switch (flg) {
    case COMBO:
      String str = (String) comboBox.getSelectedItem();
      return new ComboString(str);
    case BOOLEAN:
    case STRING:
      return cellEditors[flg].getCellEditorValue();
    default:
      return null;
    }
  }
  public Component getComponent() {
    return cellEditors[flg].getComponent();
  }
  public boolean stopCellEditing() {
    return cellEditors[flg].stopCellEditing();
  }
  public void cancelCellEditing() {
    cellEditors[flg].cancelCellEditing();
  }
  public boolean isCellEditable(EventObject anEvent) {
    return cellEditors[flg].isCellEditable(anEvent);
  }
  public boolean shouldSelectCell(EventObject anEvent) {
    return cellEditors[flg].shouldSelectCell(anEvent);
  }
  public void addCellEditorListener(CellEditorListener l) {
    cellEditors[flg].addCellEditorListener(l);
  }
  public void removeCellEditorListener(CellEditorListener l) {
    cellEditors[flg].removeCellEditorListener(l);
  }
  public void setClickCountToStart(int n) {
    cellEditors[flg].setClickCountToStart(n);
  }
  public int getClickCountToStart() {
    return cellEditors[flg].getClickCountToStart();
  }
}
public class MultiComponentTable extends JFrame {
  public MultiComponentTable() {
    super("MultiComponent Table");
    DefaultTableModel dm = new DefaultTableModel() {
      public boolean isCellEditable(int row, int column) {
        if (column == 0) {
          return true;
        }
        return false;
      }
    };
    dm.setDataVector(
        new Object[][] {
            { new ComboString("true"), "ComboString", "JLabel",
                "JComboBox" },
            { new ComboString("false"), "ComboString", "JLabel",
                "JComboBox" },
            { new Boolean(true), "Boolean", "JCheckBox",
                "JCheckBox" },
            { new Boolean(false), "Boolean", "JCheckBox",
                "JCheckBox" },
            { "true", "String", "JLabel", "JTextField" },
            { "false", "String", "JLabel", "JTextField" } },
        new Object[] { "Component", "Data", "Renderer", "Editor" });
    JTable table = new JTable(dm);
    table.getColumn("Component").setCellRenderer(new MultiRenderer());
    table.getColumn("Component").setCellEditor(new MultiEditor());
    JScrollPane scroll = new JScrollPane(table);
    getContentPane().add(scroll);
    setSize(400, 160);
    setVisible(true);
  }
  public static void main(String[] args) {
    MultiComponentTable frame = new MultiComponentTable();
    frame.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }
}