Swing/TablePagination のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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のページ分割
RowFilterでJTableのページ分割
Posted by terai at 2007-11-05
概要
JDK 6 で導入されたRowFilterを使って、JTableの行をPagination風に分割して表示します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
private static int LR_PAGE_SIZE = 5;
private final TestModel model = new TestModel();
private final TableRowSorter<TestModel> sorter = new TableRowSorter<TestModel>(model);
private final Box box = Box.createHorizontalBox();
private void initLinkBox(final int itemsPerPage, final int currentPageIndex) {
//assert currentPageIndex>0;
sorter.setRowFilter(makeRowFilter(itemsPerPage, currentPageIndex-1));
ArrayList<JRadioButton> l = new ArrayList<JRadioButton>();
int startPageIndex = currentPageIndex-LR_PAGE_SIZE;
if(startPageIndex<=0) startPageIndex = 1;
int maxPageIndex = (model.getRowCount()/itemsPerPage)+1;
int endPageIndex = currentPageIndex+LR_PAGE_SIZE-1;
if(endPageIndex>maxPageIndex) endPageIndex = maxPageIndex;
if(currentPageIndex>1)
l.add(makePNRadioButton(itemsPerPage, currentPageIndex-1, "Prev"));
for(int i=startPageIndex;i<=endPageIndex;i++)
l.add(makeRadioButton(itemsPerPage, currentPageIndex, i-1));
if(currentPageIndex<maxPageIndex)
l.add(makePNRadioButton(itemsPerPage, currentPageIndex+1, "Next"));
box.removeAll();
ButtonGroup bg = new ButtonGroup();
box.add(Box.createHorizontalGlue());
for(JRadioButton r:l) {
box.add(r); bg.add(r);
}
box.add(Box.createHorizontalGlue());
box.revalidate();
box.repaint();
l.clear();
}
private JRadioButton makeRadioButton(
final int itemsPerPage, final int current, final int target) {
JRadioButton radio = new JRadioButton(""+(target+1));
radio.setForeground(Color.BLUE);
radio.setUI(ui);
if(target+1==current) radio.setSelected(true);
radio.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
initLinkBox(itemsPerPage, target+1);
}
});
return radio;
}
private JRadioButton makePNRadioButton(
final int itemsPerPage, final int target, String title) {
JRadioButton radio = new JRadioButton(title);
radio.setForeground(Color.BLUE);
radio.setUI(ui);
radio.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
initLinkBox(itemsPerPage, target);
}
});
return radio;
}
private RowFilter<TestModel,Integer> makeRowFilter(
final int itemsPerPage, final int target) {
return new RowFilter<TestModel,Integer>() {
@Override
public boolean include(Entry<? extends TestModel, ? extends Integer> entry) {
int ei = entry.getIdentifier();
return (target*itemsPerPage<=ei && ei<target*itemsPerPage+itemsPerPage);
}
};
}
解説
上記のサンプルは、検索サイトなどでよく使われている、PaginationをJTableで行っています。
ただし、ページ数が大量にある場合の処理や、前へ、次へなどの実装は無視して、
ある位置から一定の行数だけ表示するフィルタを予め作成し、これを上部のJRadioButton*1で切り替えています。
また、モデルのインデックス順でフィルタリングしているため、ソートを行っても表示される行の範囲内で変化します。
コメント
- Prev、Next ボタンなどを追加して、Google風のPaginationを行うように変更しました。 -- terai