Swing/FixedColumnTableSorting のバックアップの現在との差分(No.9)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - 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の列固定とソート #navi(../) RIGHT:Posted by [[terai]] at 2008-11-10 *JTableの列固定とソート [#j1bd19e9] 列固定したJTableで、JDK 6 で導入されたTableRowSorterを使った行ソートを行います。 --- category: swing folder: FixedColumnTableSorting title: JTableの列固定とソート tags: [JTable, TableRowSorter, ChangeListener, JScrollPane, JViewport] author: aterai pubdate: 2008-11-10T14:26:25+09:00 description: 列固定したJTableで、JDK 6で導入されたTableRowSorterを使った行ソートを行います。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMzes1hqI/AAAAAAAAAZw/-m-PZSFzYAk/s800/FixedColumnTableSorting.png --- * 概要 [#summary] 列固定した`JTable`で、`JDK 6`で導入された`TableRowSorter`を使った行ソートを行います。 -&jnlp; -&jar; -&zip; #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTMzes1hqI/AAAAAAAAAZw/-m-PZSFzYAk/s800/FixedColumnTableSorting.png) //#screenshot http://lh3.ggpht.com/_9Z4BYR88imo/TQTMzes1hqI/AAAAAAAAAZw/-m-PZSFzYAk/s800/FixedColumnTableSorting.png **サンプルコード [#bb39c51e] #code{{ * サンプルコード [#sourcecode] #code(link){{ fixedTable = new JTable(model); table = new JTable(model); table = new JTable(model); fixedTable.setSelectionModel(table.getSelectionModel()); fixedTable.setUpdateSelectionOnSort(false); //table.setUpdateSelectionOnSort(true); // table.setUpdateSelectionOnSort(true); for(int i=model.getColumnCount()-1;i>=0;i--) { if(i<2) { 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{ } 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); 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(JScrollPane.UPPER_LEFT_CORNER, fixedTable.getTableHeader()); // 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 // <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() { public void stateChanged(ChangeEvent e) { @Override public void stateChanged(ChangeEvent e) { JViewport viewport = (JViewport) e.getSource(); scroll.getVerticalScrollBar().setValue(viewport.getViewPosition().y); } }); //</blockquote> // </blockquote> add(scroll); }} **解説 [#x610cfac] 左の固定テーブル(fixedTable)と、右のテーブル(table)に同じRowSorterを設定することで、列固定表でもソートできるようにしています。 ただし、上記のサンプルでは、ソート中に行の追加を行うと例外が発生するので、追加の前にsorter.setSortKeys(null);でSortKeysをクリアしています。 * 解説 [#explanation] - 左の列固定された表(`fixedTable`)と右の表(`table`)に同じ`RowSorter`を設定することで、列固定表でもソート可能に設定 - ソート中に行の追加を行うと例外が発生する -- 上記のサンプルでは以下のように追加前に`sorter.setSortKeys(null)`で`SortKeys`をクリアして回避 #code{{ add(new JButton(new AbstractAction("add") { public void actionPerformed(ActionEvent e) { //List<? extends RowSorter.SortKey> keys = sorter.getSortKeys(); @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}); for (int i = 0; i < 100; i++) { model.addRow(new Object[] {i, i + 1, "A" + i, "B" + i}); } //sorter.setSortKeys(keys); // sorter.setSortKeys(keys); } }), BorderLayout.SOUTH); }} ---- %%行を追加したとき、うまく描画されない場合があるので、以下のようなJPanelをラッパーとして使用しています。%% -以下を間違えてしていたため、描画がおかしくなっていた。 --JScrollPane#setRowHeaderView(Component) --JScrollPane#setRowHeader(JViewport) - %%行を追加したとき描画が乱れる場合があるので、以下のような`JPanel`をラッパーとして使用%% - 以下を取り違えていたため、描画がおかしくなっていた -- `JScrollPane#setRowHeaderView(Component)` -- `JScrollPane#setRowHeader(JViewport)` ---- 固定列でキーボードなどによるスクロールに対応するために以下のようなChangeListenerを追加しています。 -参考:[http://tips4java.wordpress.com/2008/11/05/fixed-column-table/ Fixed Column Table ≪ Java Tips Weblog] - 固定列でキーボードなどによるスクロールに対応するため、以下のような`ChangeListener`を追加 -- 参考: [https://tips4java.wordpress.com/2008/11/05/fixed-column-table/ Fixed Column Table ≪ Java Tips Weblog] #code{{ scroll.getRowHeader().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { @Override public void stateChanged(ChangeEvent e) { JViewport viewport = (JViewport) e.getSource(); scroll.getVerticalScrollBar().setValue(viewport.getViewPosition().y); } }); }} **参考リンク [#y3ae24e4] -[http://www.google.com/search?q=FixedColumnExample.java FixedColumnExample.java] -[http://tips4java.wordpress.com/2008/11/05/fixed-column-table/ Fixed Column Table ≪ Java Tips Weblog] * 参考リンク [#reference] - [http://www.google.com/search?q=FixedColumnExample.java FixedColumnExample.java] - [https://tips4java.wordpress.com/2008/11/05/fixed-column-table/ Fixed Column Table ≪ Java Tips Weblog] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTable.html#setUpdateSelectionOnSort-boolean- JTable#setUpdateSelectionOnSort(boolean) (Java Platform SE 8)] **コメント [#tda194b1] - タブキーによるフォーカスの移動は・・・、まぁいいかな。 -- [[terai]] &new{2008-11-10 (月) 14:26:25}; - 固定列は、数字でソートするように変更。 -- [[terai]] &new{2008-11-10 (月) 15:27:19}; - どちらか片方のJTableを setUpdateSelectionOnSort(false); としてソート後、選択状態がおかしくならないように修正。 -- [[terai]] &new{2010-10-23 (土) 03:13:02}; - 下記サイトは別の手法で列を固定しています。ご参考まで。<http://weblogs.java.net/blog/elevy/archive/2009/01/freezable_jtabl.html> -- [[panda]] &new{2010-12-22 (水) 15:30:06}; - 下記サイトは別の手法で列を固定しています。ご参考まで。<http://weblogs.java.net/blog/elevy/archive/2009/01/freezable_jtabl.html> -- [[panda]] &new{2010-12-22 (水) 16:01:51}; * コメント [#comment] #comment - KBD{Tab}キーによるフォーカスの移動は…、まぁいいかな。 -- &user(aterai); &new{2008-11-10 (月) 14:26:25}; - 固定列は、数字でソートするように変更。 -- &user(aterai); &new{2008-11-10 (月) 15:27:19}; - どちらか片方の`JTable`を `setUpdateSelectionOnSort(false);`としてソート後、選択状態がおかしくならないように修正。 -- &user(aterai); &new{2010-10-23 (土) 03:13:02}; - 下記サイトは別の手法で列を固定しています。ご参考まで。[http://weblogs.java.net/blog/elevy/archive/2009/01/freezable_jtabl.html Freezable JTables (are they extreme?) | Java.net] -- &user(panda); &new{2010-12-22 (水) 15:30:06}; -- 情報どうもです。ポップアップで固定する列を決めると、固定列の右が水平スクロールで移動できるのですね。最初、固定の確認で列ヘッダをリサイズしてたので迷いました(^^;。固定中は、`table.getTableHeader().setResizingAllowed(false); table.getTableHeader().setReorderingAllowed(false);`とかで、列のリサイズ、移動を禁止したほうがいいかも。でも、ソートや行選択などが簡単にできるのは便利ですね。 -- &user(aterai); &new{2010-12-22 (水) 17:32:51}; #comment