Swing/TablePagination のバックアップ(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TablePagination へ行く。
- 1 (2007-11-05 (月) 14:35:32)
- 2 (2008-03-26 (水) 20:28:31)
- 3 (2008-03-27 (木) 02:15:38)
- 4 (2008-03-30 (日) 01:38:27)
- 5 (2008-09-07 (日) 00:05:08)
- 6 (2008-11-03 (月) 21:51:54)
- 7 (2010-10-28 (木) 17:52:38)
- 8 (2011-08-15 (月) 15:51:42)
- 9 (2013-11-01 (金) 16:08:20)
- 10 (2013-11-01 (金) 21:21:16)
- 11 (2013-11-04 (月) 06:46:11)
- 12 (2014-03-18 (火) 19:04:02)
- 13 (2014-10-07 (火) 17:49:31)
- 14 (2014-11-08 (土) 01:41:12)
- 15 (2014-11-21 (金) 18:32:13)
- 16 (2015-12-26 (土) 15:57:47)
- 17 (2016-09-29 (木) 17:13:31)
- 18 (2017-10-27 (金) 16:26:13)
- 19 (2017-11-08 (水) 13:54:55)
- 20 (2018-02-24 (土) 19:51:30)
- 21 (2019-05-24 (金) 18:24:50)
- 22 (2021-02-17 (水) 08:21:11)
- title: RowFilterでJTableのページ分割
tags: [JTable, RowFilter, JRadioButton]
author: aterai
pubdate: 2007-11-05T14:35:32+09:00
description: JDK 6で導入されたRowFilterを使って、JTableの行をPagination風に分割して表示します。
hreflang:
href: http://java-swing-tips.blogspot.com/2008/03/jtable-pagination-example-using.html lang: en
概要
JDK 6
で導入されたRowFilter
を使って、JTable
の行をPagination
風に分割して表示します。
Screenshot
Advertisement
サンプルコード
private static int LR_PAGE_SIZE = 5;
private final String[] columnNames = {"Year", "String", "Comment"};
private final DefaultTableModel model = new DefaultTableModel(null, columnNames) {
@Override public Class<?> getColumnClass(int column) {
return (column == 0) ? Integer.class : Object.class;
}
};
private TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
private Box box = Box.createHorizontalBox();
private void initLinkBox(final int itemsPerPage, final int currentPageIndex) {
//assert currentPageIndex > 0;
sorter.setRowFilter(new RowFilter<TableModel, Integer>() {
@Override
public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
int ti = currentPageIndex - 1;
int ei = entry.getIdentifier();
return ti * itemsPerPage <= ei && ei < ti * itemsPerPage + itemsPerPage;
}
});
int startPageIndex = currentPageIndex - LR_PAGE_SIZE;
if (startPageIndex <= 0) {
startPageIndex = 1;
}
//#if 0 //BUG
//int maxPageIndex = (model.getRowCount() / itemsPerPage) + 1;
//#else
/* "maxPageIndex" gives one blank page if the module of the division is not zero.
* pointed out by erServi
* e.g. rowCount=100, maxPageIndex=100
*/
int rowCount = model.getRowCount();
int v = rowCount % itemsPerPage == 0 ? 0 : 1;
int maxPageIndex = rowCount / itemsPerPage + v;
//#endif
int endPageIndex = currentPageIndex + LR_PAGE_SIZE - 1;
if (endPageIndex > maxPageIndex) {
endPageIndex = maxPageIndex;
}
box.removeAll();
if (startPageIndex >= endPageIndex) {
//if I only have one page, Y don't want to see pagination buttons
//suggested by erServi
return;
}
ButtonGroup bg = new ButtonGroup();
JRadioButton f = makePrevNextRadioButton(
itemsPerPage, 1, "|<", currentPageIndex > 1);
box.add(f);
bg.add(f);
JRadioButton p = makePrevNextRadioButton(
itemsPerPage, currentPageIndex - 1, "<", currentPageIndex > 1);
box.add(p);
bg.add(p);
box.add(Box.createHorizontalGlue());
for (int i = startPageIndex; i <= endPageIndex; i++) {
JRadioButton c = makeRadioButton(itemsPerPage, currentPageIndex, i);
box.add(c);
bg.add(c);
}
box.add(Box.createHorizontalGlue());
JRadioButton n = makePrevNextRadioButton(
itemsPerPage, currentPageIndex + 1, ">", currentPageIndex < maxPageIndex);
box.add(n);
bg.add(n);
JRadioButton l = makePrevNextRadioButton(
itemsPerPage, maxPageIndex, ">|", currentPageIndex < maxPageIndex);
box.add(l);
bg.add(l);
box.revalidate();
box.repaint();
}
View in GitHub: Java, Kotlin解説
上記のサンプルは、検索サイトなどでよく使われている、Pagination
をJTable
で行っています。
ただし、ページ数が大量にある場合の処理や、前へ、次へなどの実装は無視して、
ある位置から一定の行数だけ表示するフィルタを予め作成し、これを上部のJRadioButton
(BasicRadioButtonUI
を継承して見た目だけリンク風になるよう変更している)で切り替えています。
また、モデルのインデックス順でフィルタリングしているため、ソートを行っても表示される行の範囲内で変化します。