Personal tools
You are here: Home ブログ nagai Swingでテーブルのヘッダを縦方向(行ヘッダ)へ変更する
Document Actions

Swingでテーブルのヘッダを縦方向(行ヘッダ)へ変更する

今回使用したバージョンは以下のとおりです。
JDK 6


SwingのテーブルであるJTableは横方向のヘッダ(列ヘッダ)です。これを縦方向のヘッダ(行ヘッダ)へ変更する方法です。
ここではJTableを汎化し、行ヘッダをもつJTableの子クラスを作成します。

class RowHeaderTable extends JTable {

そもそもJTableのヘッダがどのように実現されているかと言うと、対象のセルに対しヘッダ用のセルレンダラを使用しているわけです。
つまりヘッダの位置を変更したい場合は、対象としたいセルにヘッダ用のセルレンダラを適用すれば良いのです。
例えば今回の場合、左隅の縦一列をヘッダにしたいのですから(一般的に左側にヘッダが置かれる為です。異なる場合は以下の説明を
適宜読み替えて下さい。)、以下のように0行目の列を変更します。
* initializeLocalVarsは、子クラスがローカルの操作を定義する為にJTableに定義されているメソッドです。

    :
    @Override
    protected void initializeLocalVars() {
        super.initializeLocalVars();
        TableColumn tableColumn = super.getColumnModel().getColumn(0);
        tableColumn.setCellRenderer(new DefaultTableCellHeaderRenderer());
    }
    :


JTableは今回の処理に必要なTableModelを引数とするコンストラクタを提供しているので、これを利用します。
引数のDefaultTableModelを生成する際、DefaultTableModelのコンストラクタに合わせる為に行ヘッダ名の配列と列数を
それぞれ列ヘッダ名と行数へ変更します。

    :
    public RowHeaderTable(Object[] rowheaderNames, Integer columnCount) {
        super(
            new DefaultTableModel(
                rowheaderNamesToData(rowheaderNames),
                columnCountToColumnNames(columnCount)
            )
        );
    }
   
    protected static Object[][] rowheaderNamesToData() {
        List<Object[]> data = new ArrayList<Object[]>();
        for (Object rowheaderName : rowheaderNames) {
            data.add(new Object[]{rowheaderName});
        }
        return data.toArray(new Object[data.size()][]);
    }
   
    protected static Object[] columnCountToColumnNames(Integer dataLength) {
        List<Object> columnNames = new ArrayList<Object>();
        for (Integer i = 0; i < dataLength; i++) {
            columnNames.add("");
        }
        return columnNames.toArray();
    }
    :


これで後はこのTableクラスを以下のように適切に呼び出すだけです。

     JFrame frame = new JFrame("Row Header Table Sample");
     JTable table = new RowHeaderTable(rowHeaderNames, columnCount);
     table.setRowHeight(rowHeight);
     table.setPreferredSize(
         new Dimension(columnWidth*columnCount, rowHeaderNames.length*rowHeight)
     );
     Container contentPane = frame.getContentPane();
     contentPane.add(table);
     frame.pack();
     frame.setVisible(true);


Category(s)
Swing
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/nagai/swing30c630fc30eb306e30d830c330927e2665b95411-884c30d830c3-3078590966f43059308b/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.