Swing/FixedColumnTableSorting のバックアップ(No.18)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FixedColumnTableSorting へ行く。
- 1 (2008-11-10 (月) 14:26:25)
- 2 (2008-11-10 (月) 15:27:19)
- 3 (2008-11-10 (月) 17:37:08)
- 4 (2008-11-11 (火) 00:17:58)
- 5 (2008-12-01 (月) 17:15:53)
- 6 (2010-01-01 (金) 00:40:33)
- 7 (2010-10-23 (土) 03:11:14)
- 8 (2010-12-22 (水) 15:30:06)
- 9 (2010-12-22 (水) 17:13:57)
- 10 (2011-03-27 (日) 02:52:08)
- 11 (2013-01-15 (火) 18:00:58)
- 12 (2013-07-26 (金) 01:53:51)
- 13 (2013-08-20 (火) 14:22:33)
- 14 (2013-10-30 (水) 21:30:09)
- 15 (2014-12-10 (水) 17:38:27)
- 16 (2015-02-16 (月) 15:30:27)
- 17 (2015-07-10 (金) 17:40:37)
- 18 (2016-01-12 (火) 18:01:08)
- 19 (2016-06-05 (日) 23:50:52)
- 20 (2017-09-14 (木) 12:09:14)
- 21 (2017-11-02 (木) 15:32:16)
- 22 (2019-03-05 (火) 18:54:17)
- 23 (2020-12-20 (日) 01:37:36)
- 24 (2023-05-26 (金) 18:55:54)
- title: JTableの列固定とソート tags: [JTable, TableRowSorter, ChangeListener, JScrollPane, JViewport] author: aterai pubdate: 2008-11-10T14:26:25+09:00 description: 列固定したJTableで、JDK 6で導入されたTableRowSorterを使った行ソートを行います。
概要
列固定したJTable
で、JDK 6
で導入されたTableRowSorter
を使った行ソートを行います。
Screenshot
Advertisement
サンプルコード
fixedTable = new JTable(model);
table = new JTable(model);
fixedTable.setSelectionModel(table.getSelectionModel());
fixedTable.setUpdateSelectionOnSort(false);
//table.setUpdateSelectionOnSort(true);
for (int i = model.getColumnCount() - 1; i >= 0; i--) {
if (i < 2) {
table.removeColumn(table.getColumnModel().getColumn(i));
fixedTable.getColumnModel().getColumn(i).setResizable(false);
} else {
fixedTable.removeColumn(fixedTable.getColumnModel().getColumn(i));
}
}
fixedTable.setRowSorter(sorter);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
fixedTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
table.setRowSorter(sorter);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
final JScrollPane scroll = new JScrollPane(table);
JViewport viewport = new JViewport();
viewport.setView(fixedTable);
viewport.setPreferredSize(fixedTable.getPreferredSize());
scroll.setRowHeader(viewport);
//scroll.setRowHeaderView(fixedTable);
//fixedTable.setPreferredScrollableViewportSize(fixedTable.getPreferredSize());
scroll.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, fixedTable.getTableHeader());
scroll.getViewport().setBackground(Color.WHITE);
viewport.setBackground(Color.WHITE);
//<blockquote cite="http://tips4java.wordpress.com/2008/11/05/fixed-column-table/">
//@auther Rob Camick
//@title Fixed Column Table ≪ Java Tips Weblog
scroll.getRowHeader().addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
JViewport viewport = (JViewport) e.getSource();
scroll.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
}
});
//</blockquote>
add(scroll);
View in GitHub: Java, Kotlin解説
左の固定テーブル(fixedTable
)と、右のテーブル(table
)に同じRowSorter
を設定することで、列固定表でもソートできるようにしています。
ただし、上記のサンプルでは、ソート中に行の追加を行うと例外が発生するので、追加の前にsorter.setSortKeys(null);
でSortKeys
をクリアしています。
add(new JButton(new AbstractAction("add") {
@Override public void actionPerformed(ActionEvent e) {
//List<? extends RowSorter.SortKey> keys = sorter.getSortKeys();
sorter.setSortKeys(null);
for (int i = 0; i < 100; i++) {
model.addRow(new Object[] {i, i + 1, "A" + i, "B" + i});
}
//sorter.setSortKeys(keys);
}
}), BorderLayout.SOUTH);
行を追加したとき、うまく描画されない場合があるので、以下のようなJPanel
をラッパーとして使用しています。
- 以下を取り違えていたため、描画がおかしくなっていた
JScrollPane#setRowHeaderView(Component)
JScrollPane#setRowHeader(JViewport)
固定列でキーボードなどによるスクロールに対応するために以下のようなChangeListener
を追加しています。
scroll.getRowHeader().addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
JViewport viewport = (JViewport) e.getSource();
scroll.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
}
});