appendix> swing> JTable TOPUPPREVNEXT

javax.swing.JTable

【主な機能】

表形式のビューを提供します。

JTable 自身にデータを保持することもできますが、 ここでは簡単なデータモデルを用意し表示する例を紹介します。

データモデルを JTable に渡して表の形に表示させるのですが、 データモデルは最低限次の3つの機能を提供しなければいけません。

データモデルに機能を追加して、 変更された値をデータモデルに反映させたり、 カラム(列)に表題をつけたりしてみましょう。

【関連するクラスの継承関係】

    java.lang.Object
          ├ java.awt.Component
          │   └ java.awt.Container
          │        └ javax.swing.JComponent
          │             ├ javax.swing.JTable
          │             ├ javax.swing.table.JTableHeader
          │             └ javax.swing.JLabel
          │                   └ javax.swing.table.DefaultTableCellRenderer
          ├ javax.swing.table.AbstractTableModel
          │   └ javax.swing.table.DefaultTableModel
          ├ javax.swing.table.DefaultTableColumnModel
          └ javax.swing.table.TableColumn

【主なコンストラクタ】

コンストラクタ機能
JTable ( TableModel model ) データモデル model を指定して JTable を生成します。

javax.swing.JTable のおもなメソッド】

メソッド機能
void addRowSelectionInterval (
int start ,
int end )
start から end 行(両端を含む)を現在の選択領域に追加します。
void setAutoResizeMode (int mode ) mode には次の値が指定できます。 ある列幅を変更した場合(列名欄の区切りをドラッグする)、 全体の幅を変えないために、どこの幅を変更するかという指定です。
AUTO_RESIZE_ALL_COLUMNS
変更している列以外の全列が均等に変更される
AUTO_RESIZE_LAST_COLUMN
最右端の列の幅で調整される
AUTO_RESIZE_NEXT_COLUMN
右隣の列の幅で調整される
AUTO_RESIZE_OFF
列幅の調整を自動的には行わない。必要な場合スクロールバーが表示される
AUTO_RESIZE_SUBSEQUENT_COLUMNS
列幅を変更した列より右側の列の幅を均等に調整する
デフォルト値です。
【例6】 参照 JTableDemo6.java 58行目
void clearSelection ( ) どの行も列も選択されていない状態にします。
Dimension getPreferredScrollableViewportSize ( ) このテーブルの縦横の大きさをピクセル数で答えます。
【例1】 参照 JTableDemo1sizeB.java の29、38〜47行目
void setPreferredScrollableViewportSize ( Dimension size ) このテーブルの縦横の大きさをピクセル数で設定します。
【例1】 参照 JTableDemo1size.java の32行目

【インターフェース javax.swing.table.TableModel が定めるメソッド】

TableModel は、AbstractTableModel で実装されています。 機能欄が空白のメソッドについては次表を参照してください。

メソッド機能
void addTableModelListener ( TableModelListener l) テーブルが変更の通知を受け取るリスナを登録します。 テーブルが変更されると tableChanged が呼び出されます。
Class<?> getColumnClass ( int columnIndex )
int getColumnCount ( )
String getColomnName ( int columnIndex )
int getRowCount ( )
Object getValueAt ( int rowIndex , int columnIndex )
boolean isCellEditable ( int rowIndex , int columnIndex )
void removeTableModelListener ( TableModelListener l ) リスナを登録を解除します。
void setValueAt ( Object value , int rowIndex , int columnIndex )

javax.swing.table.AbstractTableModel のメソッド】

必ず実装しなければならないメソッド

メソッド返す値
int getRowCount ( ) テーブルの行数
int getColumnCount ( ) テーブルの列数
Object getValueAt ( int row , int col ) テーブルの ( row , col ) に表示してほしい値

その他のおもなメソッド

メソッド機能
void fireTableCellUpdated (
int row ,
int col )
テーブルのセル ( roe , col ) の値が 変更されたことをシステム全体に通知します。
void fireTableDataChanged ( ) テーブルの値が変更されたことをシステム全体に通知します。
void fireTableStructureChanged ( ) テーブルの形が変わり全体を表示しなおす必要があることをシステムに通知します。
String getColumnName ( int col ) 欄の表題に表示したい文字列を返します。
boolean isCellEditable ( int row , int col ) デフォルトはセルの編集は不可です。
セル ( row , col ) を編集可能としたい場合には true を返すようにしておきます。
void setValueAt (
Object value
int row ,
int col )
セル ( row , col ) の値が変更され value になったという通知です。

【例1】

2次元の配列を Jtable として表示する例。

プログラム JTableDemo1.java

28行目で JTable のコンストラクタにデータモデル dataModel を渡して table という名前のビューを作成し、 29行目で table をスクロールペインに貼り付けています。

20〜26行目でデータモデルの定義を行い、dataModel という名前をつけています。 このデータモデルは最低限次の3つの機能

だけを用意しています。 コールバック・ルーチン( JTable から呼び出されて、答を返すメソッド )です。
getValueAtObject を返すことになっていますから、 int を直接返すことはできません。 文字列に変換して返すことにします。
J2SE 5.0 では
return data[row][col];
と記述するだけで、オートボクシングで Inteter クラスが返されます。

実行結果 (J2SE 5.0)

JTableDemo1-1.gif  縮小すると  JTableDemo1-2.gif

スクロールペインに貼り付けているため縦方向のスクロールが表示されます。 横方向のスクロールは 【例6】AUTO_RESIZE_OFF を参照してください。

表題をつけてみましょう。getColumnName を追加します。

プログラム JTableDemo1h.java

実行結果 (J2SE 1.4)

JTableDemo1h-1.gif

大きさを指定しましょう。8、16、32行目を追加しました。

プログラム JTableDemo1size.java

実行結果 (J2SE 1.4)

JTableDemo1size-1.gif

表題欄をドラッグすると欄の入れ替えが出来ます。 表示が変化しても、プログラム上の row 、 col には影響がありません。

JTableDemo1size-2.gif

getPreferredScrollableViewportSize をオーバーライドしても同じことが出来ます。

プログラム JTableDemo1sizeB.java

【例2】

例1の第1列(欄B)を編集可能にし、 値が変更されたら第2列(欄C)に10倍の値を表示するようにしましょう。

プログラム JTableDemo2.java

26〜29行目を追加し、第1桁を編集可能にします。

30〜39行目に値が変更された場合の処理を追加します。 これもコールバックルーチンです。 つまり、値が変更された場合この setValueAt メソッドを呼び出してもらい、 rowcolvalue に変更された旨を通知してもらう、という仕掛けです。

32行目で正しく整数に変換できた場合にデータを書き直し(33〜34行目)、 35〜36行目でデータが変更された旨をシステム全体に通知します。

実行例

B欄の 30 を消し、369 に書き直し ENTER キーを押したところです。

JTableDemo2-1.gif

【例3】

小数点付きの数値のCSVを読み込んで、2次元の double の表を表示します。

プログラム JTableDemo3.java

AbstractTableModel クラスの拡張が大きくなってきましたので、匿名クラスをやめ DoubleData という独立したクラスにします。
簡単なメニューバーを用意し、 「 Open ] が選択されたらファイルチューザでファイル選択します。 メニューの準備とファイル選択を DataControl というクラスにまとめました。
24、28〜31行目
ファイルから入力する前のテーブルをどうするかが問題になりますが、 0 行 0列 の配列で初期化しておくことにしました。
25、41〜74行目
選択されたファイルからデータを読むために追加した部分です。
データを読んでみないと何行何列あるかがわからないのに、 配列 data の大きさを合わせようとしているため、 少し複雑になっています。データ件数も 10000 行 100列までに制限されます。
55行目で生成した各行を、59行目で生成した2次元の配列に詰め込んで、 各行の長さが等しいのを確認して(61〜64行目)から data に代入しています(65行目)。 モデルが変わったことを66行目で通知をしています。
77〜116行目
メニューの作成と、メニューが押された場合の処理。

実行例

読んだデータ data3.txt

 JTableDemo3-1.gif  縮小すると  JTableDemo3-2.gif

【例4】

浮動小数以下の表示桁を合わせ、表示を右詰にしてみましょう。

プログラム JTableDemo4.java

実行例

JTableDemo4-1.gif

プログラム JTableDemo3.java からの 変更点

【例5】

セルの更新をできるようにして、ファイルの出力をしましょう。

プログラム JTableDemo5.java

プログラム JTableDemo4.java からの 変更点

【例6】

setAutoResizeMode の例。 これはコールバックではなく、JTable を生成後設定する例です。

プログラム JTableDemo6.java

実行例

5種類のリサイズを大きさの異なるフレームに表示するプログラムですが、そのうちの2つを掲げます。 C欄とD欄の間(表題欄の線)をドラッグして広げた例です。

AUTO_RESIZE_ALL_COLUMNS AUTO_RESIZE_OFF
 JTableDemo6-1.gif   JTableDemo6-2.gif 

getAutoResizeMode をオーバーライドしても同じことが出来ます。

プログラム JTableDemo6B.java


更新日:2006-01-11