JTableの列固定とソート
Total: 21155
, Today: 3
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
列固定した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);
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="https://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);
}
});
参考リンク
- FixedColumnExample.java
- Fixed Column Table ≪ Java Tips Weblog
- JTable#setUpdateSelectionOnSort(boolean) (Java Platform SE 8)