概要

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 in GitHub: Java, Kotlin

解説

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

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

  • タブの位置を変更するJComboBoxを追加
    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);
        }
      }
    });
    

参考リンク

コメント