概要

JTabbedPaneで選択したタブの高さを変更します。

サンプルコード

class WindowsTabHeightTabbedPaneUI extends WindowsTabbedPaneUI {
  private static final int TAB_AREA_HEIGHT = 32;
  @Override protected int calculateTabHeight(
      int tabPlacement, int tabIndex, int fontHeight) {
    return TAB_AREA_HEIGHT;
  }
  @Override protected void paintTab(
      Graphics g, int tabPlacement, Rectangle[] rects,
      int tabIndex, Rectangle iconRect, Rectangle textRect) {
    if (tabPane.getSelectedIndex() != tabIndex
        && tabPlacement != JTabbedPane.LEFT
        && tabPlacement != JTabbedPane.RIGHT) {
      int tabHeight = TAB_AREA_HEIGHT / 2 + 3;
      rects[tabIndex].height = tabHeight;
      if (tabPlacement == JTabbedPane.TOP) {
        rects[tabIndex].y = TAB_AREA_HEIGHT - tabHeight + 3;
      }
    }
    super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect);
  }
}
view all

解説

上記のサンプルでは、選択されていないタブの高さを低くすることで、選択されたタブの高さが目立つように設定しています。

  • BasicTabbedPaneUI#calculateTabHeight(...)などをオーバーライドして、タブ(領域)の高さを変更
  • BasicTabbedPaneUI#paintTab(...)などをオーバーライドして、描画されるタブの高さをBasicTabbedPaneUI#calculateTabHeight(...)で設定した高さの半分程度に変更
    • JTabbedPane.TOPの場合、選択されていないタブのy座標を下に移動
  • 対応しているのは、JTabbedPane.SCROLL_TAB_LAYOUTの場合のみ
    • JTabbedPane.TOPJTabbedPane.BOTTOMの場合、選択したタブの高さが変化する
    • JTabbedPane.LEFTJTabbedPane.RIGHTの場合、すべてのタブがBasicTabbedPaneUI#calculateTabHeight(...)で設定した高さになる

注: 以下のようにタブの位置を変更するJComboBoxを追加したので、JDK 1.7.0以上が必要

private static enum TabPlacements {
  TOP(JTabbedPane.TOP), BOTTOM(JTabbedPane.BOTTOM),
  LEFT(JTabbedPane.LEFT), RIGHT(JTabbedPane.RIGHT);
  public final int tabPlacement;
  private TabPlacements(int tabPlacement) {
    this.tabPlacement = tabPlacement;
  }
}
private final JComboBox<TabPlacements> comboBox =
    new JComboBox<>(TabPlacements.values());
private final JTabbedPane tabbedPane = new JTabbedPane(
    JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
//...
comboBox.addItemListener(new ItemListener() {
  @Override public void itemStateChanged(ItemEvent e) {
    if (e.getStateChange() == ItemEvent.SELECTED) {
      tabbedPane.setTabPlacement(((TabPlacements) e.getItem()).tabPlacement);
    }
  }
});

コメント