import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.table.*;

/**
 * @author Remi Forax
 *
 */
public class BinOpTableExample {

  interface BinOp {
    public int eval(int left,int right);
  }

  static class BinOpTableModel extends AbstractTableModel {
    public BinOpTableModel(BinOp binOp) {
      this.binOp=binOp;
    }
    
    public int getColumnCount() {
      return 10;
    }

    public int getRowCount() {
      return 10;
    }

    public Object getValueAt(int row, int column) {
      return new Integer(binOp.eval(row+1,column+1));
    }
    
    public String getColumnName(int column) {
      return Integer.toString(column+1);
    }
    
    public Class getColumnClass(int columnIndex) {
      return Integer.class;
    }
    
    public void setBinOp(BinOp binOp) {
      this.binOp=binOp;
      fireTableDataChanged();
    }
    
    private BinOp binOp;
  }

  public static void main(String[] args) {
    
    BinOp[] binOps=new BinOp[] {
      new BinOp() {
        public int eval(int left, int right) {
          return left+right;
        }
        public String toString() {
          return "addition";
        }
      },
      new BinOp() {
        public int eval(int left, int right) {
          return left*right;
        }
        public String toString() {
          return "multiplication";
        }
      }
    };
    
    final BinOpTableModel model=new BinOpTableModel(binOps[0]);
    
    final JComboBox combo=new JComboBox(binOps);
    combo.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        model.setBinOp((BinOp)combo.getSelectedItem());
      }
    });
    
    JPanel panel=new JPanel();
    panel.add(combo);
    
    JTable table=new JTable(model);
    
    JFrame frame=new JFrame("BinOpTableExample");
    Container c=frame.getContentPane();
    c.add(panel,BorderLayout.NORTH);
    c.add(new JScrollPane(table));
    frame.pack();
    frame.show();
  }
}
