---
category: swing
folder: PinTabbedPane
title: JTabbedPaneのタブを固定する
tags: [JTabbedPane, JPopupMenu, JLabel]
author: aterai
pubdate: 2011-12-05T14:18:41+09:00
description: JTabbedPaneにJPopupMenuを追加して、指定したタブのタイトルと位置を変更し、タブの固定を行います。
image: https://lh4.googleusercontent.com/-QqKPFV0ZzIc/TttWYFUshII/AAAAAAAABFk/6HcCBI_bg-0/s800/PinTabbedPane.png
---
* 概要 [#summary]
`JTabbedPane`に`JPopupMenu`を追加して、指定したタブのタイトルと位置を変更し、タブの固定を行います。

#download(https://lh4.googleusercontent.com/-QqKPFV0ZzIc/TttWYFUshII/AAAAAAAABFk/6HcCBI_bg-0/s800/PinTabbedPane.png)

* サンプルコード [#sourcecode]
#code(link){{
pinTabMenuItem = new JCheckBoxMenuItem(new AbstractAction("pin tab") {
  @Override public void actionPerformed(ActionEvent e) {
    JTabbedPane t = (JTabbedPane) getInvoker();
    JCheckBoxMenuItem check = (JCheckBoxMenuItem) e.getSource();
    int idx = t.getSelectedIndex();
    Component cmp = t.getComponentAt(idx);
    Component tab = t.getTabComponentAt(idx);
    Icon icon = t.getIconAt(idx);
    String tip = t.getToolTipTextAt(idx);
    boolean flg = t.isEnabledAt(idx);

    int i;
    if (check.isSelected()) {
      for (i = 0; i < idx; i++) {
        String s = t.getTitleAt(i);
        if (s == null || s.isEmpty()) {
          continue;
        }
        break;
      }
    } else {
      for (i = t.getTabCount() - 1; i > idx; i--) {
        String s = t.getTitleAt(i);
        if (s != null && !s.isEmpty()) {
          continue;
        }
        break;
      }
    }
    t.remove(idx);
    t.insertTab(check.isSelected() ? "" : tip, icon, cmp, tip, i);
    t.setTabComponentAt(i, tab);
    t.setEnabledAt(i, flg);
    if (flg) {
      t.setSelectedIndex(i);
    }
  }
});
}}

* 解説 [#explanation]
- タブを固定
-- タブタイトルを空にする
-- タブの位置を左側に移動
-- 固定したタブは削除不可
-- タブの位置を最も左に存在する未固定タブの左隣りに移動
-- 固定したタブは削除不可に設定
- タブの固定を解除
-- タブタイトルを`TooltipText`から復元する
-- タブの位置を固定されていないタブの右側に移動
-- タブの位置を最も左に存在する未固定タブの右隣りに移動
- `TabPlacement`の`LEFT`、`RIGHT`は考慮していない

* 参考リンク [#reference]
- [https://xp-style-icons.en.softonic.com/ XP Style Icons - Download]

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