JTable クラス(AbstractDataModel)

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 {

	/******************/
	/* コンストラクタ */
	/******************/
	Win (String name)
	{
					// Frameクラスのコンストラクタ(Windowのタイトルを引き渡す)
		super(name);
					// データ
		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;
		Font f1 = new Font("MS 明朝", Font.PLAIN, 20);
		Font f2 = new Font("MS 明朝", Font.PLAIN, 25);

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

		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(650, 180);
					// ウィンドウを表示
		setVisible(true);
					// イベントアダプタ
		addWindowListener(new WinEnd());
	}

	/**********************/
	/* AbstractTableModel */
	/**********************/
	class Table_Model extends AbstractTableModel {

		Object cel[][];
		String label[];
		int n, m;
					// コンストラクタ
		public Table_Model(int n_i, int m_i, Object cel_i[][], String label_i[])
		{
			int i1, i2, sum;

			n     = n_i;
			m     = m_i;
			cel   = new Object [n][m];
			label = new String [m];

			for (i1 = 0; i1 < n; i1++) {
				sum = 0;
				for (i2 = 0; i2 < m-3; i2++)
					cel[i1][i2] = cel_i[i1][i2];
				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);
			}

			for (i1 = 0; i1 < m; i1++)
				label[i1] = label_i[i1];
		}
					// 行数を返す
		public int getRowCount()
		{
			return n;
		}
					// 列数を返す
		public int getColumnCount()
		{
			return m;
		}
					// セルの値を返す
		public Object getValueAt(int r, int c)
		{
			return (Object)cel[r][c];
		}
					// タイトル名を返す
		public String getColumnName(int c)
		{
			return label[c];
		}
					// レンダラー(各セルを描く方法)
					//    Boolean : check box. 
					//    Number : right-aligned label. 
					//    ImageIcon : centered label. 
					//    Object : label(object's string value)
		public Class getColumnClass(int c)
		{
			return getValueAt(0, c).getClass();
		}
					// 変種可能か否かを返す
		public boolean isCellEditable(int r, int c) 
		{
			if (c <= 1 || c >= 5)
				return false;
			else
				return true;
		}
					// セルの値を設定する
		public void setValueAt(Object value, int r, int c)
		{
			int i1, sum = 0;

			cel[r][c] = value;

			for (i1 = 2; i1 < m-3; i1++)
				sum += Integer.parseInt(cel[r][i1].toString());
			cel[r][m-3] = Integer.valueOf(Integer.toString(sum));
			sum         = (int)((double)sum / (m - 5) + 0.5);
			cel[r][m-2] = Integer.valueOf(Integer.toString(sum));
			if (sum > 3000)
				cel[r][m-1] = new Boolean(true);
			else
				cel[r][m-1] = new Boolean(false);

			fireTableCellUpdated(r, c);
			fireTableCellUpdated(r, m-3);
			fireTableCellUpdated(r, m-2);
			fireTableCellUpdated(r, m-1);
		}
	}

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

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