• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: ExpandActiveTabWidth
title: JTabbedPaneで選択されているタブの幅のみ拡張する
tags: [JTabbedPane]
author: aterai
pubdate: 2018-10-29T16:08:36+09:00
description: JTabbedPaneで現在選択されているタブの幅は拡張、その他のタブは縮小するよう設定します。
image: https://drive.google.com/uc?id=1NIZXoyEHh-K_H-BZ83l3pG5phVRjpmOzbQ
---
* 概要 [#summary]
`JTabbedPane`で現在選択されているタブの幅は拡張、その他のタブは縮小するよう設定します。

#download(https://drive.google.com/uc?id=1NIZXoyEHh-K_H-BZ83l3pG5phVRjpmOzbQ)

* サンプルコード [#sourcecode]
#code(link){{
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;
  }
}
}}

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

* 参考リンク [#reference]
- [[JTabbedPaneの選択文字色を変更>Swing/ColorTab]]

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