Swing/RowSorterPopupMenu のバックアップの現在との差分(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/RowSorterPopupMenu へ行く。
- 1 (2010-07-27 (火) 08:35:20)
- 2 (2011-06-05 (日) 02:43:47)
- 3 (2013-01-03 (木) 14:16:15)
- 4 (2013-03-16 (土) 03:03:17)
- 5 (2013-03-18 (月) 02:23:04)
- 6 (2013-03-29 (金) 07:44:06)
- 7 (2013-03-29 (金) 17:13:05)
- 8 (2013-03-31 (日) 17:37:14)
- 9 (2013-03-31 (日) 18:39:02)
- 10 (2013-04-02 (火) 22:33:32)
- 11 (2013-04-03 (水) 04:00:04)
- 12 (2013-04-05 (金) 09:20:43)
- 13 (2013-04-05 (金) 17:48:04)
- 14 (2013-04-06 (土) 05:10:49)
- 15 (2013-09-23 (月) 04:40:23)
- 16 (2015-01-21 (水) 18:38:07)
- 17 (2015-01-28 (水) 15:03:53)
- 18 (2015-03-27 (金) 21:45:53)
- 19 (2017-02-02 (木) 15:12:59)
- 20 (2017-12-20 (水) 16:38:51)
- 21 (2019-08-30 (金) 18:00:31)
- 22 (2019-12-17 (火) 13:55:43)
- 23 (2021-06-18 (金) 08:41:30)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableHeaderにJPopupMenuを追加してソート #navi(../) RIGHT:Posted by [[terai]] at 2009-12-07 *JTableHeaderにJPopupMenuを追加してソート [#h2e26e10] JTableHeaderにJPopupMenuを追加してソートします。 --- category: swing folder: RowSorterPopupMenu title: JTableHeaderにJPopupMenuを追加してソート tags: [JTable, JTableHeader, JPopupMenu, PopupMenuListener, TableRowSorter] author: aterai pubdate: 2009-12-07T14:24:46+09:00 description: JTableHeaderにJPopupMenuを追加してソートします。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTSY9WWpNI/AAAAAAAAAis/Z0YqvftAIh8/s800/RowSorterPopupMenu.png --- * 概要 [#summary] `JTableHeader`に`JPopupMenu`を追加してソートします。 -&jnlp; -&jar; -&zip; #download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTSY9WWpNI/AAAAAAAAAis/Z0YqvftAIh8/s800/RowSorterPopupMenu.png) #screenshot **サンプルコード [#f95550c3] #code{{ * サンプルコード [#sourcecode] #code(link){{ private class TablePopupMenu extends JPopupMenu { private final List<SortAction> actions = Arrays.asList( new SortAction(SortOrder.ASCENDING), new SortAction(SortOrder.DESCENDING)); //new SortAction(SortOrder.UNSORTED)); // new SortAction(SortOrder.UNSORTED)); public TablePopupMenu() { super(); for(Action a:actions) add(a); for (Action a: actions) { add(a); } } @Override public void show(Component c, int x, int y) { JTableHeader h = (JTableHeader)c; int i = h.columnAtPoint(new Point(x, y)); i = h.getTable().convertColumnIndexToModel(i); for(SortAction a:actions) a.setIndex(i); super.show(c, x, y); @Override public void show(Component c, int x, int y) { if (c instanceof JTableHeader) { JTableHeader header = (JTableHeader) c; JTable table = header.getTable(); header.setDraggedColumn(null); header.repaint(); table.repaint(); int i = table.convertColumnIndexToModel(header.columnAtPoint(new Point(x, y))); if (i >= 0) { actions.forEach(a -> a.setIndex(i)); super.show(c, x, y); } } } } private class SortAction extends AbstractAction{ private class SortAction extends AbstractAction { private final SortOrder dir; private int index = -1; public SortAction(SortOrder dir) { super(dir.toString()); this.dir = dir; } private int index = -1; public void setIndex(int index) { this.index = index; } @Override public void actionPerformed(ActionEvent e) { table.getRowSorter().setSortKeys(Arrays.asList( new RowSorter.SortKey(index, dir))); } } }} **解説 [#lf26eb87] 上記のサンプルでは、マウスカーソルの下にあるJTabelHeaderカラムをクリック(WindowsLnF:右クリック)することで、JPopupMenuを表示してソートすることができます。 * 解説 [#explanation] 上記のサンプルでは、マウスカーソルの下にある`JTableHeader`カラムをクリック(`WindowsLookAndFeel`:右クリック)して`JPopupMenu`を表示し、昇順か降順の`JMenuItem`を指定してのソートが可能になっています。デフォルトのカラム左クリックによるソートは`TableRowSorter#toggleSortOrder(...)`をオーバーライドして無効にしています。 ---- ソートしたあとで、JTableHeaderのフォーカスペイントをクリアするために以下のようなPopupMenuListenerを追加しています。 - %%ソートに`JTableHeader`のフォーカスペイントをクリアするために以下のような`PopupMenuListener`を追加%% - 列を右クリックで表示範囲外までドラッグしてからリリースしてポップアップを開くと描画が乱れるので、`JPopupMenu#show(...)`をオーバーライドしてドラッグ状態の解消、ヘッダ、テーブルの再描画を実行 -- `PopupMenuListener`を利用する場合は`popupMenuWillBecomeInvisible`ではなく`popupMenuWillBecomeVisible`でも同様の処理を行う #code{{ JPopupMenu pop = new TablePopupMenu(); final JTableHeader header = table.getTableHeader(); JTableHeader header = table.getTableHeader(); header.setComponentPopupMenu(pop); pop.addPopupMenuListener(new PopupMenuListener() { public void popupMenuCanceled(PopupMenuEvent e) {} public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { //System.out.println("popupMenuWillBecomeInvisible"); @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { header.setDraggedColumn(null); //header.setResizingColumn(null); //header.setDraggedDistance(0); header.repaint(); header.getTable().repaint(); } public void popupMenuWillBecomeVisible(PopupMenuEvent e) {} @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { // header.setDraggedColumn(null); header.repaint(); header.getTable().repaint(); } @Override public void popupMenuCanceled(PopupMenuEvent e) {} }); }} //**参考リンク **コメント [#pda540a5] * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/DefaultRowSorter.html#toggleSortOrder-int- DefaultRowSorter#toggleSortOrder(int) (Java Platform SE 8)] * コメント [#comment] #comment #comment