概要

JTabbedPaneで現在選択されているタブの幅は拡張、その他のタブは縮小するよう設定します。

サンプルコード

public static void updateTabWidth(JTabbedPane tabs) {
  int tp = tabs.getTabPlacement();
  if (tp == JTabbedPane.LEFT || tp == JTabbedPane.RIGHT) {
    return;
  }
  int sidx = tabs.getSelectedIndex();
  for (int i = 0; i < tabs.getTabCount(); i++) {
    Component c = tabs.getTabComponentAt(i);
    if (c instanceof ShrinkLabel) {
      ((ShrinkLabel) c).setSelected(i == sidx);
    }
  }
}

class ShrinkLabel extends JLabel {
  private boolean isSelected;
  protected ShrinkLabel(String title, Icon icon) {
    super(title, icon, SwingConstants.LEFT);
  }

  @Override public Dimension getPreferredSize() {
    Dimension d = super.getPreferredSize();
    if (!isSelected) {
      d.width = 20;
    }
    return d;
  }

  public void setSelected(boolean active) {
    this.isSelected = active;
  }

  public boolean isSelected() {
    return isSelected;
  }
}
View in GitHub: Java, Kotlin

解説

  • JTabbedPane#setTabComponentAt(...)メソッドを使用してタブコンポーネントにJLabelを設定
  • JLabel#getPreferredSize()メソッドをオーバーライドして選択されていない場合はそのJLabelの推奨サイズを縮小
    • 選択されている場合は、super.getPreferredSize()メソッドでJLabelの元サイズを返す
  • JTabbedPaneChangeListenerを追加し、タブ選択が変更されたらすべてのタブコンポーネントの選択状態(推奨サイズ)を更新
  • タブの配置が左右の場合は、選択されたタブの幅のみ変更しても意味がないのでこの処理は実行しない

参考リンク

コメント