JTable - テーブル

トップ > チップス > JTable - テーブル
2012-02-13, jtable

/tips/java/swing/jtable **セル内の文字を右寄せ(或いはセンタリング)する 右寄せ指定したレンダラを列にセットします。 :DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); :renderer.setHorizontalAlignment(SwingConstants.RIGHT); :getTable().getColumn("列名").setCellRenderer(renderer);

**列の幅を変更する :getTable().getColumn("列名").setPreferredWidth(100); ※setSizeでは動作しない点に注意が必要です。

**選択列の変更イベントを捕捉する テーブルそのものは、「何列目が選択された」というイベントを捕捉することができません。selectionModelを取得し、そこにリスナを追加します。 :getTable().getSelectionModel().addListSelectionListener(listener);

**列にソート機能を付与する ※J2SE6以降の機能です。 TableRowSorterを用います。 :TableModel model = new DefaultTableModel(); :JTable table = new JTable(model); :RowSorter sorter = new TableRowSorter(model); :table.setRowSorter(sorter);

**印刷する レイアウト等の柔軟性はない分、簡単に利用することができます。サンプル中の「PrintUtilities.getNumberOfPages」は、Printable.printメソッドが、Printable.NO_SUCH_PAGEを返す位置を探し、Printableのページ数を返すメソッドです(lumber-commonsに含まれています)。

:Book book = new Book(); :Printable printable; :// :printable = table.getPrintable(PrintMode.FIT_WIDTH, new MessageFormat(""), new MessageFormat("")); :int pages = PrintUtilities.getNumberOfPages(printable, pageFormat, 100); :// printメソッドは一度しか呼び出せない仕様になっているようです。 :// そのため、改めてPrintableを取得します。 :// MessageFormat中の「\{0\}」は現在のページ番号に置き換えられます。 :printable = table.getPrintable(PrintMode.FIT_WIDTH, new MessageFormat("ヘッダ"), new MessageFormat("\{0\} / "+pages)); :book.append(printable, pageFormat,pages);

**Boolean,ImageIcon用のレンダラを利用する Object型の列に対しては通常、toStringの戻り値が描画されますが、以下のように、getColumnClass(int)メソッドを通じて、適切なクラスを返すようにすると、ImageIconクラスとBooleanクラスについては、専用のレンダラが使用されるようになります。

:DefaultTableModel model = new DefaultTableModel(new Object[] { "a","b", "c"}, 0) { : @Override : public Class getColumnClass(int columnIndex) { : // a列にアイコンを、c列にチェックボックスをレンダリングします : switch(columnIndex){ : case 0: : return ImageIcon.class; : case 2: : return Boolean.class; : default: : return super.getColumnClass(columnIndex); : } : } :};

**列に関連付けられたクラスを変更する DefaultTableModelを使用すると全ての列のクラスが「Object」になってしまい、アイコン等をセルに格納しても文字列として表示されてしまいます。また、列のクラスを指定するメソッドも用意されていないため、下記例のようにgetColumnClassをオーバライドすることで対応します。 :DefaultTableModel model = new DefaultTableModel(colNames, 0) { : : @Override : public Class getColumnClass(int columnIndex) { : switch (columnIndex) { : case 0: : return ImageIcon.class; : default: : return super.getColumnClass(columnIndex); : } : } : :};

**コンポーネントの初期サイズを調節する 通常のコンポーネントサイズ設定メソッドに加えてJTableでは、以下のメソッドでサイズを設定することができます。

:JTable table = new JTable(); :table.setPreferredScrollableViewportSize(new Dimension(240,200));

**ツールチップをセル毎に変える setToottipTextではテーブル単位でしかツールチップを設定できないので、getTooltipTextメソッドをオーバライドして実現します。rowAtPointというメソッドを利用して、現在のマウスカーソル位置の行番号を取得しています。 :JTable table = new JTable(sorter) { : public String getToolTipText(MouseEvent e) { : int row = rowAtPoint(e.getPoint()); : return ""+row; : } :};

-参考:http://terai.xrea.jp/Swing/RowTooltips.html

**スクロールバーを最下部に移動する (勿論、JScrollPane内に配置した時限定ですが)JViewportを取得して、スクロールバーの位置を調整することができます。但し、モデルに行を追加した直後は注意が必要です。JTable.getHeightが何故か行追加前の高さを返してくるため、以下のコードは意図した通りに動作しません。

:model.addRow(rowData); : :// 最下部から一行分上の中途半端な位置に移動する :JViewport v = (JViewport) table.getParent(); :int vh = v.getVisibleRect().height; :int th = table.getHeight(); :v.setViewPosition(new Point(0, th - vh));

以下のように、キューに入れてやると上手く動きます。

:model.addRow(rowData); : :// 最下部に移動する :SwingUtilities.invokeLater(new Runnable() { : @Override : public void run() { : JViewport v = (JViewport) table.getParent(); : int vh = v.getVisibleRect().height; : int th = table.getHeight(); : v.setViewPosition(new Point(0, th - vh)); : } :});

この記事は役に立ちましたか?