JTable クラス( TableModelListener )

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.*;

public class Test {
	public static void main (String[] args)
	{
		Win win = new Win("Test Window");
	}
}

/*******************/
/* クラスWinの定義 */
/*******************/
class Win extends JFrame implements TableModelListener {

	String label[] = {"国", "地域", "1月", "2月", "3月", "合計", "平均", "目標"};
	Object cel[][] =
        {{new ImageIcon("Japan.gif"), "東京", new Integer(5850), new Integer(4700),
          new Integer(6020), new Integer(0), new Integer(0), new Boolean(false)},
         {new ImageIcon("England.gif"), "ロンドン", new Integer(4200), new Integer(3800),
          new Integer(3630), new Integer(0), new Integer(0), new Boolean(false)},
         {new ImageIcon("Japan.gif"), "大阪", new Integer(2540), new Integer(2610),
          new Integer(2210), new Integer(0), new Integer(0), new Boolean(false)},
         {new ImageIcon("France.gif"), "パリ", new Integer(2300), new Integer(1800),
          new Integer(1960), new Integer(0), new Integer(0), new Boolean(false)},
         {new ImageIcon("China.gif"), "香港", new Integer(1500), new Integer(1250),
          new Integer(1430), new Integer(0), new Integer(0), new Boolean(false)}};
	int n = 5, m = 8;
	TableModel model;

	/******************/
	/* コンストラクタ */
	/******************/
	Win (String name)
	{
					// Frameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// 合計と平均の計算
		int i1, i2, sum;
		for (i1 = 0; i1 < n; i1++) {
			sum = 0;
			for (i2 = 2; i2 < m-3; i2++)
				sum += Integer.parseInt(cel[i1][i2].toString());
			cel[i1][m-3] = Integer.valueOf(Integer.toString(sum));
			sum          = (int)((double)sum / (m - 5) + 0.5);
			cel[i1][m-2] = Integer.valueOf(Integer.toString(sum));
			if (sum > 3000)
				cel[i1][m-1] = new Boolean(true);
		}
					// テーブル
		Font f1 = new Font("MS 明朝", Font.PLAIN, 20);
		Font f2 = new Font("MS 明朝", Font.PLAIN, 25);

		JTable tb = new JTable(cel, label);
		tb.setFont(f1);
		tb.getTableHeader().setFont(f2);
		tb.setRowHeight(30);
		tb.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

		model = tb.getModel();
		model.addTableModelListener(this);

		Container cp = getContentPane();
		JLabel lb = new JLabel("第1四半期の売り上げ");
		lb.setFont(f2);
		cp.add(lb, BorderLayout.NORTH);
		cp.add(new JScrollPane(tb), BorderLayout.CENTER);
					// Windowの大きさ
		setSize(700, 180);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/******************************/
	/* 上,左,下,右の余白の設定 */
	/******************************/
	public Insets getInsets()
	{
		return new Insets(35, 10, 10, 10);
	}

	/**************************/
	/* 値が変化したときの処理 */
	/**************************/
	public void tableChanged(TableModelEvent e) {
		if (e.getSource() == model) {
			int r = e.getFirstRow();
			int c = e.getColumn();
			System.out.println(r + "行" + c + "列の値が修正されました");
		}
	}

	/************/
	/* 終了処理 */
	/************/
	class WinEnd extends WindowAdapter
	{
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
}