概要

JTabbedPaneJPopupMenuを追加して、指定したタブのタイトルと位置を変更し、タブの固定を行います。

サンプルコード

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);
    }
  }
});
View in GitHub: Java, Kotlin

解説

  • タブを固定
    • タブタイトルを空にする
    • タブの位置を最も左に存在する未固定タブの左隣りに移動
    • 固定したタブは削除不可に設定
  • タブの固定を解除
    • タブタイトルをTooltipTextから復元する
    • タブの位置を最も左に存在する未固定タブの右隣りに移動
  • TabPlacementLEFTRIGHTは考慮していない

参考リンク

コメント