TITLE:JTableHeaderの字揃えを変更
Posted by at 2010-11-29

JTableHeaderの字揃えを変更

JTableHeaderの字揃えを変更します。
  • 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

概要

JTableHeaderの字揃えをTableCellRendererを使って変更します。
HorizontalAlignmentHeaderRenderer.png

サンプルコード

サンプルコード

#spandel
class HorizontalAlignmentHeaderRenderer implements TableCellRenderer{
#spanend
#spanadd
class HorizontalAlignmentHeaderRenderer implements TableCellRenderer {
#spanend
  private int horizontalAlignment = SwingConstants.LEFT;
  public HorizontalAlignmentHeaderRenderer(int horizontalAlignment) {
    this.horizontalAlignment = horizontalAlignment;
  }
  public Component getTableCellRendererComponent(
#spanadd

#spanend
  @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);
    JLabel l = (JLabel) r.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column);
    l.setHorizontalAlignment(horizontalAlignment);
    return l;
  }
}
View in GitHub: Java, Kotlin

解説

  • Test1:
    • JTableHeaderから、DefaultRenderer を取得し、setHorizontalAlignmentメソッドで字揃えを設定

解説

  • Test1:
    • JTableHeaderからDefaultRendererを取得してsetHorizontalAlignmentメソッドで字揃えを設定
    • すべての列の字揃えが変更される
      #spandel
      ((JLabel)table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
      #spanend
      #spanadd
      ((JLabel) table.getTableHeader().getDefaultRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
      #spanend
      
  • Test2:
    • DefaultTableCellRendererを継承するレンダラーを設定
    • LookAndFeelの色などが表示されない?
  • Test2:
    • DefaultTableCellRendererを継承するレンダラーを設定
    • LookAndFeelの色などが表示されない?
      table.getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() {
        public Component getTableCellRendererComponent(
        @Override public Component getTableCellRendererComponent(
            JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
          super.getTableCellRendererComponent(
              table,value,isSelected,hasFocus,row,column);
              table, value, isSelected, hasFocus, row, column);
          setHorizontalAlignment(SwingConstants.CENTER);
          return this;
          }
        }
      });
      
  • Test3:
    • TableCellRenderer#getTableCellRendererComponent(...)メソッド内で、デフォルトのヘッダレンダラーを取得し、字揃えを設定
    • 上記のHorizontalAlignmentHeaderRendererを全ての列に設定
  • Test3:
    • TableCellRenderer#getTableCellRendererComponent(...)メソッド内でデフォルトのヘッダセルレンダラーを取得して字揃えを設定
    • 上記のHorizontalAlignmentHeaderRendererを全ての列に設定
      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列目だけ中央揃えにすることが可能だが、初回がWindowsLnFなどのSystemLookAndFeelの場合、LookAndFeelを変更するとNullPointerExceptionが発生する(それ以外の場合でもヘッダのLnFが切り替わらない)。
  • 以下の方法でも0列目だけ中央揃えになるが初回がWindowsLookAndFeelなどのSystemLookAndFeelの場合、あとでLookAndFeelを変更するとNullPointerExceptionが発生する
    • それ以外の場合でもヘッダのLookAndFeelが切り替わらない
#spandel
try{
#spanend
#spanadd
try {
#spanend
  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
#spandel
}catch(Exception e) {
#spanend
#spanadd
} catch (Exception e) {
#spanend
  e.printStackTrace();
}
#spandel
//...
#spanend
#spandel
final TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
#spanend
#spandel
//table.getColumnModel().getColumn(0).setHeaderRenderer(new TableCellRenderer() {
#spanend
#spanadd
// ...
#spanend
#spanadd
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
#spanend
#spanadd
// table.getColumnModel().getColumn(0).setHeaderRenderer(new TableCellRenderer() {
#spanend
table.getTableHeader().setDefaultRenderer(new TableCellRenderer() {
  public Component getTableCellRendererComponent(JTable table, Object value,
  @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) {
    JLabel l = (JLabel) renderer.getTableCellRendererComponent(
          table, value, isSelected, hasFocus, row, column);
    if (table.convertColumnIndexToModel(column) == 0) {
      l.setHorizontalAlignment(SwingConstants.CENTER);
    }else{
    } else {
      l.setHorizontalAlignment(SwingConstants.LEFT);
    }
    return l;
  }
});

参考リンク

参考リンク

コメント

コメント