テーブルモデルの作成
では、テーブルモデルから作成しましょう。ここでは「MyTableModel」という名前のクラスとして作成することにします。ここでは、各セルに、行・列数の和を表示させるような形でモデルを用意してみます。
class MyTableModel extends AbstractTableModel { private int col = 10; private int row = 10; public MyTableModel(int col,int row){ super(); this.col = col; this.row = row; } @Override public int getColumnCount() { return col; } @Override public int getRowCount() { return row; } @Override public Object getValueAt(int col, int row) { return "" + (col + row); } }
AbstractTableModelには、計3つのメソッドが用意されます。これらはそれぞれ以下のような働きをします。
- getColumnCount ――列数を返します。
- getRowCount――行数を返します。
- getValueAt――引 数で指定された列・行の値を返します。
ここでは、getValueAtでは単に2つの引数の和を返しているだけですが、もちろん配列などを使って値を管理し、引数に応じて返すようにすることも可能です。
レンダラーの作成
続いて、2つのレンダラークラスを作成します。ここでは「MyTableRenderer」「MyHeaderRenderer」という名前で用意することにしましょう。
class MyTableRenderer implements TableCellRenderer { @Override public Component getTableCellRendererComponent( Table table, Object val, int col, int row){ Label label = new Label((String)val); TableLayoutData layoutData = new TableLayoutData(); layoutData.setAlignment(Alignment.ALIGN_RIGHT); label.setLayoutData(layoutData); return label; } } class MyHeaderRenderer implements TableCellRenderer { private static final long serialVersionUID = 1L; @Override public Component getTableCellRendererComponent( Table table, Object val, int col, int row) { Label label = new Label((String)val); TableLayoutData layoutData = new TableLayoutData(); layoutData.setBackground(new Color(0,200,255)); layoutData.setAlignment(Alignment.ALIGN_CENTER); label.setLayoutData(layoutData); return label; } }
本体部分もヘッダー部分も、レンダラーはいずれもTableCellRendererをimplementsして作成します。このインターフェイスには、「getTableCellRendererComponent」というメソッドが用意されており、ここでセルに表示される内容を作成します。このメソッドでは、呼び出しているTable、表示される値となるObject、列数と行数のint値が引数として渡されており、それらに応じて表示をレンダリングしreturnします。ただし、表示する値は渡されますが、ここで表示するテキストなどを設定しても、実際にはそのとおりには反映されません。値は先ほど作成したテーブルモデルによって管理されるからです。レンダラーは、あくまで表示するセル部分を作成するものです。
ここでは、新たにLabelを作成し、プロパティ類を設定したものをreturnしています。各種の設定を行う際、「TableLayoutData」というインスタンスを作成し、これに設定を行っています。テーブルのレイアウトは、このように専用クラスを使って設定を行うようになっています。