• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: TableHeaderHeight
title: JTableHeaderの高さを変更
tags: [JTableHeader, JTable, JScrollPane, JViewport]
author: aterai
pubdate: 2012-05-28T14:51:47+09:00
description: 内部の文字サイズなどはそのままで、JTableHeaderの高さだけを変更する方法をテストします。
image: https://lh4.googleusercontent.com/-l20IOO5wKSo/T8MIf7FVUwI/AAAAAAAABNM/9BNN63T96Fo/s800/TableHeaderHeight.png
hreflang:
    href: http://java-swing-tips.blogspot.com/2012/06/height-of-jtableheader.html
    href: https://java-swing-tips.blogspot.com/2012/06/height-of-jtableheader.html
    lang: en
---
* 概要 [#i0975169]
* 概要 [#summary]
内部の文字サイズなどはそのままで、`JTableHeader`の高さだけを変更する方法をテストします。

#download(https://lh4.googleusercontent.com/-l20IOO5wKSo/T8MIf7FVUwI/AAAAAAAABNM/9BNN63T96Fo/s800/TableHeaderHeight.png)

* サンプルコード [#zb516453]
* サンプルコード [#sourcecode]
#code(link){{
JScrollPane scroll = new JScrollPane(table);
scroll.setColumnHeader(new JViewport() {
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.height = 32;
    return d;
  }
});
}}

* 解説 [#aacfefbf]
- 上
* 解説 [#explanation]
- 上: `Bad: JTableHeader#setPreferredSize(...)`
-- `JTableHeader`に`null`(デフォルト)以外のサイズを`setPreferredSize(...)`で設定
-- `JTable.AUTO_RESIZE_OFF`の場合、設定されたこのサイズが列の追加や列幅の変更で更新されないため、ヘッダの描画が不正になる
--- [http://d.hatena.ne.jp/kensir0u/20090416/1239898154 JTableのJTalbeHeaderの高さを変更して列幅の合計が1200ピクセルを超えて横スクロールするとバグった。 - kensir0uのしくみ]
-- `JTable.AUTO_RESIZE_OFF`以外の場合は、`setPreferredSize(...)`で設定された幅は無視されて、`JTable`の幅が使用される
-- 列幅の調整を自動的に行わない`JTable.AUTO_RESIZE_OFF`モードの場合、設定されたこのサイズが列の追加や列幅の変更で更新されないためヘッダの描画が不正になる
--- [https://kensir0u.hatenadiary.org/entry/20090416/1239898154 JTableのJTalbeHeaderの高さを変更して列幅の合計が1200ピクセルを超えて横スクロールするとバグった。 - kensir0uのしくみ]
-- `JTable.AUTO_RESIZE_OFF`以外の場合は`setPreferredSize(...)`で設定された幅は無視されて`JTable`の幅が使用される

- 下
-- `JViewport#getPreferredSize()`もしくは、`JTableHeader#getPreferredSize()`をオーバーライドして、`JTableHeader`の高さを変更
- 下: `Override getPreferredSize()`
-- `JViewport#getPreferredSize()`もしくは`JTableHeader#getPreferredSize()`をオーバーライドして`JTableHeader`の高さを変更
#code{{
table.setTableHeader(new JTableHeader(table.getColumnModel()) {
  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    d.height = 32;
    return d;
  }
});
}}
-- `viewport.setPreferredSize(...)`と設定しても可?
-- `JTableHeader#getHeight()`をオーバーライドすると、ヘッダ文字列などの描画だけ変更される
-- `JTableHeader#getHeight()`をオーバーライドするとヘッダ文字列などの描画だけ変更される
--- `getHeight()`は`JTableHeader#getHeaderRect()`で使用されているため

* 参考リンク [#we49e437]
- [http://d.hatena.ne.jp/kensir0u/20090416/1239898154 JTableのJTalbeHeaderの高さを変更して列幅の合計が1200ピクセルを超えて横スクロールするとバグった。 - kensir0uのしくみ]
-- このバグ?の状態を適切に示す良いサンプルコードがあります。
- [https://bugs.openjdk.java.net/browse/JDK-4473075 #JDK-4473075 JTable header rendering problem (after setting preferred size) - Java Bug System]
* 参考リンク [#reference]
- [https://kensir0u.hatenadiary.org/entry/20090416/1239898154 JTableのJTalbeHeaderの高さを変更して列幅の合計が1200ピクセルを超えて横スクロールするとバグった。 - kensir0uのしくみ]
-- このバグ?の状態を適切に示す良いサンプルコードがある
- [https://bugs.openjdk.org/browse/JDK-4473075 JDK-4473075 JTable header rendering problem (after setting preferred size) - Java Bug System]
-- `JDK 9`で修正されている

* コメント [#ib91d24e]
* コメント [#comment]
#comment
#comment