Swing/HorizontalAlignmentHeaderRenderer の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/HorizontalAlignmentHeaderRenderer へ行く。
- Swing/HorizontalAlignmentHeaderRenderer の差分を削除
--- category: swing folder: HorizontalAlignmentHeaderRenderer title: JTableHeaderの字揃えを変更 tags: [JTable, JTableHeader, LookAndFeel, TableCellRenderer] author: aterai pubdate: 2010-11-29T14:41:04+09:00 description: JTableHeaderの字揃えをTableCellRendererを使って変更します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTN5ZuPeZI/AAAAAAAAAbg/Fivi4R1rR-Y/s800/HorizontalAlignmentHeaderRenderer.png hreflang: href: https://java-swing-tips.blogspot.com/2016/09/changing-jtable-header-text-alignment.html lang: en --- * 概要 [#summary] `JTableHeader`の字揃えを`TableCellRenderer`を使って変更します。 #download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTN5ZuPeZI/AAAAAAAAAbg/Fivi4R1rR-Y/s800/HorizontalAlignmentHeaderRenderer.png) * サンプルコード [#sourcecode] #code(link){{ class HorizontalAlignmentHeaderRenderer implements TableCellRenderer { private int horizontalAlignment = SwingConstants.LEFT; public HorizontalAlignmentHeaderRenderer(int horizontalAlignment) { this.horizontalAlignment = horizontalAlignment; } @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { TableCellRenderer r = table.getTableHeader().getDefaultRenderer(); JLabel l = (JLabel) r.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); l.setHorizontalAlignment(horizontalAlignment); return l; } } }} * 解説 [#explanation] - `Test1`: -- `JTableHeader`から、`DefaultRenderer`を取得し、`setHorizontalAlignment`メソッドで字揃えを設定 -- `JTableHeader`から`DefaultRenderer`を取得して`setHorizontalAlignment`メソッドで字揃えを設定 -- すべての列の字揃えが変更される #code{{ ((JLabel) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER); }} - `Test2`: -- `DefaultTableCellRenderer`を継承するレンダラーを設定 -- `LookAndFeel`の色などが表示されない? #code{{ table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); setHorizontalAlignment(SwingConstants.CENTER); return this; } }); }} - `Test3`: -- `TableCellRenderer#getTableCellRendererComponent(...)`メソッド内で、デフォルトのヘッダセルレンダラーを取得し、字揃えを設定 -- `TableCellRenderer#getTableCellRendererComponent(...)`メソッド内でデフォルトのヘッダセルレンダラーを取得して字揃えを設定 -- 上記の`HorizontalAlignmentHeaderRenderer`を全ての列に設定 #code{{ table.getColumnModel().getColumn(0).setHeaderRenderer( new HorizontalAlignmentHeaderRenderer(SwingConstants.LEFT)); table.getColumnModel().getColumn(1).setHeaderRenderer( new HorizontalAlignmentHeaderRenderer(SwingConstants.CENTER)); table.getColumnModel().getColumn(2).setHeaderRenderer( new HorizontalAlignmentHeaderRenderer(SwingConstants.RIGHT)); }} ---- - 以下の方法でも `0`列目だけ中央揃えになるが、初回が`WindowsLookAndFeel`などの`SystemLookAndFeel`の場合、あとで`LookAndFeel`を変更すると`NullPointerException`が発生する - 以下の方法でも`0`列目だけ中央揃えになるが初回が`WindowsLookAndFeel`などの`SystemLookAndFeel`の場合、あとで`LookAndFeel`を変更すると`NullPointerException`が発生する -- それ以外の場合でもヘッダの`LookAndFeel`が切り替わらない #code{{ try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } // ... TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer(); // table.getColumnModel().getColumn(0).setHeaderRenderer(new TableCellRenderer() { table.getTableHeader().setDefaultRenderer(new TableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { JLabel l = (JLabel) renderer.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column); if (table.convertColumnIndexToModel(column) == 0) { l.setHorizontalAlignment(SwingConstants.CENTER); } else { l.setHorizontalAlignment(SwingConstants.LEFT); } return l; } }); }} * 参考リンク [#reference] - [[JTableHeaderのフォントを変更>Swing/HeaderFont]] * コメント [#comment] #comment #comment