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); } } }