モジュール java.desktop
パッケージ javax.swing

クラスJTable

java.lang.Object
すべての実装されたインタフェース:
ImageObserver, MenuContainer, Serializable, EventListener, Accessible, CellEditorListener, ListSelectionListener, RowSorterListener, TableColumnModelListener, TableModelListener, Scrollable

@JavaBean(defaultProperty="UI", description="A component which displays data in a two dimensional grid.") public class JTable extends JComponent implements TableModelListener, Scrollable, TableColumnModelListener, ListSelectionListener, CellEditorListener, Accessible, RowSorterListener
JTableは、セルの通常の2次元テーブルを表示および編集するために使用されます。 JTable使用のタスク指向のマニュアルと例については、『The Java Tutorial』の「How to Use Tables」を参照してください。

JTableは、そのレンダリングおよび編集をカスタマイズできるようにする多数の機能を備える一方で、こうした機能のデフォルトを提供して簡単なテーブルを容易に設定できるようにしています。 たとえば、10行10列から構成されるテーブルは次のように設定できます。

      TableModel dataModel = new AbstractTableModel() {
          public int getColumnCount() { return 10; }
          public int getRowCount() { return 10;}
          public Object getValueAt(int row, int col) { return Integer.valueOf(row*col); }
      };
      JTable table = new JTable(dataModel);
      JScrollPane scrollpane = new JScrollPane(table);
 

JTableは通常、JScrollPaneの内部に配置されます。 デフォルトでは、水平スクロール・バーが必要ないようにJTableがその幅を調整します。 水平スクロール・バーを使用できるようにするには、AUTO_RESIZE_OFFsetAutoResizeMode(int)を呼び出します。 スタンドアロンのビュー(JScrollPaneの外側)内でJTableを使用し、ヘッダーを表示する場合は、getTableHeader()を使用してヘッダーを取得し、個別に表示できます。

行のソートおよびフィルタ・リングを可能にするには、RowSorterを使用します。 行ソーターは、次の2種類の方法で設定できます。

  • RowSorterを直接設定します。 たとえば、table.setRowSorter(new TableRowSorter(model))です。
  • autoCreateRowSorterプロパティをtrueに設定し、JTableが自動的にRowSorterを作成するようにします。 たとえば、setAutoCreateRowSorter(true)です。

JTableを使用するアプリケーションを設計する場合、テーブルのデータを表現するデータ構造に十分注意する必要があります。 DefaultTableModelObjectVectorsのVectorを使用してセルの値を格納する実装のモデルです。 アプリケーションからDefaultTableModelにデータをコピーするとともに、上記の例のとおり、データが直接JTableに渡されるように、TableModelインタフェースのメソッド内のデータをラップすることもできます。 これにより、モデルがデータにもっとも適した内部表現を自由に選択できることから、一層効果的なアプリケーションを作成できます。 AbstractTableModelまたはDefaultTableModelのどちらを使用するかを決める大まかな指針では、サブクラスを作成するための基底クラスとしてAbstractTableModelが使用され、サブクラス化が不要な場合にDefaultTableModelが使用されます。

ソースとして配布されるdemo領域の「TableExample」ディレクトリは、多数のJTableの使用方法に関する完全な例を提供します。この例には、データベースから取得するデータの編集可能なビューを提供するためにJTableを使用する方法や、特殊なレンダリングやエディタを使用するためにディスプレイ内の列を変更する方法などがあります。

JTableは整数型を排他的に使用して、それが表示するモデルの行と列をどちらも参照します。 JTableは単に表形式範囲のセルを取得してgetValueAt(int, int)を使用し、描画時にモデルから値を取り出します。 さまざまなJTableメソッドから返される列インデックスと行インデックスはJTable (ビュー)のものであり、モデルが使用するインデックスとは必ずしも同じではありません。

デフォルトでは、列はJTableで配置しなおされて、ビューの列がモデル内の列とは異なる順番で表示されるようになります。 これは、モデルの実装にまったく影響を与えません。列の並替えを行うときは、JTableは列の新しい順番を内部的に維持し、その列インデックスをモデルの照会前に変換します。

このため、TableModelを記述するときは、ビューで何が起こっているかにかかわらずモデルはそれ自身の座標系で照会されるので、列並べ替えイベントに待機する必要はありません。 examples配下には、列ではなく行の順番を変更するもう1つの座標系を挿入するための、この方法を利用した並べ替えアルゴリズムのサンプルが用意されています。

同様に、RowSorterから提供されるソート機能とフィルタリング機能を使用するときに、配下のTableModelがソートの方法を把握している必要はありません。ソート処理は、RowSorterによって行われます。 行ベースのJTableメソッドと配下のTableModelを使用する場合は、座標変換が必要になります。 行ベースのJTableメソッドはすべてRowSorterに関するものであり、配下のTableModelのメソッドと必ずしも一致していません。 たとえば、選択は常にJTableに関して行われるので、RowSorterを使用するときは、convertRowIndexToViewまたはconvertRowIndexToModelを使用して変換する必要があります。 JTableから配下のモデルに座標変換を行う方法を次に示します。

   int[] selection = table.getSelectedRows();
   for (int i = 0; i < selection.length; i++) {
     selection[i] = table.convertRowIndexToModel(selection[i]);
   }
   // selection is now in terms of the underlying TableModel
 

デフォルトでは、ソートが有効になっている場合、JTableは、ソート時にモデルの選択内容と可変の行の高さを保持します。 たとえば配下のモデルの行0が現在選択されている場合は、ソート後も配下のモデルの行0が選択されます。 視覚的には選択内容が変更されている可能性がありますが、配下のモデルの選択内容は変わっていません。 例外は、モデル・インデックスが可視でなくなった場合や、削除された場合です。 たとえば、モデルの行0がフィルタされて表示されなくなった場合、ソート後に選択内容は空になります。

J2SE 5では、JTableに、一般的な出力要求を実現できる便利なメソッドを追加しています。 新しいprint()メソッドを使用するだけで、迅速かつ容易に出力機能をアプリケーションに追加できます。 また、さらに高度な出力要求には、新しいgetPrintable(javax.swing.JTable.PrintMode, java.text.MessageFormat, java.text.MessageFormat)メソッドを使用できます。

すべてのJComponentクラスに関しては、InputMapActionMapを使用してActionオブジェクトとKeyStrokeを関連付け、指定した条件でアクションを実行できます。

警告: Swingはスレッドに対して安全ではありません。 詳細は、「Swing's Threading Policy」を参照してください。

警告: このクラスの直列化されたオブジェクトは、今後のSwingリリースと互換ではなくなる予定です。 現在の直列化のサポートは、短期間の格納や、同じバージョンのSwingを実行するアプリケーション間のRMIに適しています。 1.4では、すべてのJavaBeansの長期ストレージのサポートがjava.beansパッケージに追加されました。 XMLEncoderを参照してください。

導入されたバージョン:
1.2
関連項目: