Swing/RowHeaderStyle のバックアップの現在との差分(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/RowHeaderStyle へ行く。
- 1 (2012-11-05 (月) 14:47:06)
- 2 (2012-12-07 (金) 16:35:30)
- 3 (2012-12-25 (火) 18:12:21)
- 4 (2012-12-26 (水) 11:23:42)
- 5 (2013-01-28 (月) 02:12:56)
- 6 (2013-01-29 (火) 23:37:36)
- 7 (2014-06-06 (金) 18:37:18)
- 8 (2014-10-30 (木) 00:09:02)
- 9 (2015-02-22 (日) 21:03:18)
- 10 (2016-01-13 (水) 13:32:47)
- 11 (2017-06-28 (水) 17:27:41)
- 12 (2018-06-29 (金) 14:20:39)
- 13 (2020-06-11 (木) 22:59:13)
- 14 (2021-11-30 (火) 07:15:03)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTableの行ヘッダに列ヘッダのRendererを使用する #navi(../) RIGHT:Posted by [[aterai]] at 2012-11-05 *JTableの行ヘッダに列ヘッダのRendererを使用する [#bbb304da] JTableの行の描画に、JTableHeaderから取得した列ヘッダのRendererを適用します。 --- category: swing folder: RowHeaderStyle title: JTableの行ヘッダに列ヘッダのRendererを使用する tags: [JTable, JTableHeader, TableCellRenderer, Icon] author: aterai pubdate: 2012-11-05T14:47:06+09:00 description: JTableの行の描画に、JTableHeaderから取得した列ヘッダのRendererを適用します。 image: https://lh3.googleusercontent.com/-FSdrv2BDUCo/UJaJTUVXcdI/AAAAAAAABWU/gBeKokda9h8/s800/RowHeaderStyle.png --- * 概要 [#summary] `JTable`の行の描画に、`JTableHeader`から取得した列ヘッダの`Renderer`を適用します。 -&jnlp; -&jar; -&zip; #download(https://lh3.googleusercontent.com/-FSdrv2BDUCo/UJaJTUVXcdI/AAAAAAAABWU/gBeKokda9h8/s800/RowHeaderStyle.png) //#screenshot #ref(https://lh3.googleusercontent.com/-FSdrv2BDUCo/UJaJTUVXcdI/AAAAAAAABWU/gBeKokda9h8/s800/RowHeaderStyle.png) **サンプルコード [#g455a7bd] * サンプルコード [#sourcecode] #code(link){{ class RowHeaderRenderer extends JLabel implements TableCellRenderer { private int rollOverRowIndex = -1; public RowHeaderRenderer(JTable table) { super(); RollOverListener rol = new RollOverListener(); table.addMouseListener(rol); table.addMouseMotionListener(rol); } @Override public Component getTableCellRendererComponent( JTable tbl, Object val, boolean isS, boolean hasF, int row, int col) { TableCellRenderer tcr = tbl.getTableHeader().getDefaultRenderer(); boolean f = row==rollOverRowIndex; JLabel l = (JLabel)tcr.getTableCellRendererComponent( tbl, val, isS, f?f:hasF, -1, -1); if(tcr.getClass().getName().indexOf("XPDefaultRenderer")>0) { boolean f = row == rollOverRowIndex; JLabel l = (JLabel) tcr.getTableCellRendererComponent( tbl, val, isS, f ? f : hasF, -1, -1); if (tcr.getClass().getName().indexOf("XPDefaultRenderer") >= 0) { l.setOpaque(!f); this.setIcon(new ComponentIcon(l)); return this; } else { return l; } } private int rollOverRowIndex = -1; class RollOverListener extends MouseAdapter { @Override public void mouseMoved(MouseEvent e) { JTable table = (JTable)e.getSource(); JTable table = (JTable) e.getComponent(); Point pt = e.getPoint(); int col = table.columnAtPoint(pt); int column = table.convertColumnIndexToModel(col); if(column!=0) return; int prev_row = rollOverRowIndex; if (column != 0) { return; } int prevRow = rollOverRowIndex; rollOverRowIndex = table.rowAtPoint(pt); if(rollOverRowIndex == prev_row) return; if (rollOverRowIndex == prevRow) { return; } Rectangle repaintRect; if(rollOverRowIndex >= 0) { if (rollOverRowIndex >= 0) { Rectangle r = table.getCellRect(rollOverRowIndex, col, false); if(prev_row >= 0) { repaintRect = r.union(table.getCellRect(prev_row, col, false)); if (prevRow >= 0) { repaintRect = r.union(table.getCellRect(prevRow, col, false)); } else { repaintRect = r; } } else { repaintRect = table.getCellRect(prev_row, col, false); repaintRect = table.getCellRect(prevRow, col, false); } table.repaint(repaintRect); } @Override public void mouseExited(MouseEvent e) { JTable table = (JTable)e.getSource(); JTable table = (JTable) e.getComponent(); Point pt = e.getPoint(); int col = table.columnAtPoint(pt); int column = table.convertColumnIndexToModel(col); if(column!=0) return; if(rollOverRowIndex >= 0) { if (column != 0) { return; } if (rollOverRowIndex >= 0) { table.repaint(table.getCellRect(rollOverRowIndex, col, false)); } rollOverRowIndex = -1; } } } class ComponentIcon implements Icon { private final JComponent cmp; public ComponentIcon(JComponent cmp) { this.cmp = cmp; } @Override public int getIconWidth() { return 4000; //Short.MAX_VALUE; return 4000; // Short.MAX_VALUE; } @Override public int getIconHeight() { return cmp.getPreferredSize().height + 4; //XXX: +4 for Windows 7 return cmp.getPreferredSize().height + 4; // XXX: +4 for Windows 7 } @Override public void paintIcon(Component c, Graphics g, int x, int y) { SwingUtilities.paintComponent( g, cmp, (Container)c, x, y, getIconWidth(), getIconHeight()); g, cmp, (Container) c, x, y, getIconWidth(), getIconHeight()); } } }} **解説 [#ycdf77c6] 上記のサンプルでは、0列目のセルの描画に、JTable#getTableHeader()#getDefaultRenderer()で取得したレンダラーを使用するTableCellRendererを適用しています。 - ソートされていても、ソートアイコンが描画されないようする -- 引数の行と列を両方-1 にして、TableCellRenderer#getTableCellRendererComponent(...)で描画用コンポーネント(JLabel)をヘッダレンダラーから取得 - Windows Look & Feel -- ロールオーバーを描画する場合は、TableCellRenderer#getTableCellRendererComponent(...)で取得したコンポーネントを透明にする -- 右と下側に余白が発生するので、ヘッダーレンダラーからサイズを変更したアイコンを作成して、JLabel#setIcon(Icon)で表示 * 解説 [#explanation] 上記のサンプルでは、`0`列目のセルに`JTable#getTableHeader()#getDefaultRenderer()`メソッドで取得したセルレンダラーを使用する`TableCellRenderer`を適用しています。 **参考リンク [#ved2537f] - ソートアイコンが列ヘッダに表示されていても行ヘッダには表示しない -- 引数の行と列を両方`-1`に設定して、`TableCellRenderer#getTableCellRendererComponent(...)`で描画用コンポーネント(`JLabel`)をヘッダセルレンダラーから取得 - `WindowsLookAndFeel` -- ロールオーバーを描画する場合は`TableCellRenderer#getTableCellRendererComponent(...)`で取得したコンポーネントを透明にする -- 右と下側に余白が発生するのでヘッダセルレンダラーからサイズを変更したアイコンを作成して`JLabel#setIcon(Icon)`で表示 * 参考リンク [#reference] - [[JTableに行ヘッダを追加>Swing/TableRowHeader]] - [[JTableのセルのハイライト>Swing/CellHighlight]] **コメント [#gd8088ef] * コメント [#comment] #comment #comment