Java
Swing
JTable

JavaSE7からMetalUIのTableHeaderのHeightが変更されている

More than 1 year has passed since last update.

それはある日突然に気づく

ふと自作のSwingアプリをJavaSE8で実行すると、JTableのヘッダの高さが違うことに気づく。具体的には上下2pxずつ増えている。どうやらMetalUIの初期値が変更されているようだ。理由はわからないが勝手にこんなところを変えるなよとその時は思った。

タイミングはJavaSE7から

原因を究明するため過去のバージョンをインストールし、フルパスでJVMを実行しつつ検証する。どうやら7から変更されているらしいことを突き止める。

src.zipを比較

MetalUIのTableHeader.cellBorderを設定している部分が変更されており、BorderのInsetsを取るところが変更されている。どうやらJavaSE6までのが間違えていたらしい変更のされ方である。7まで誰も気づかなかったのか…

とりあえず元に戻す方法

不具合の修正とはいえユーザーとしては勝手に変更されてしまうと困るので、この修正をなかったことにする。MetalUIだけ治ればよかったので、元のInsetsを返すように変更する。

UIManager.put("TableHeader.cellBorder", new MetalBorders.TableHeaderBorder() {
  @Override
  public Insets getBorderInsets(Component c, Insets insets) {
    insets.left = insets.top = insets.right = insets.bottom = 0;
    return insets;
  }
});
SwingUtilities.updateComponentTreeUI(this);