---
category: swing
folder: TabWithCheckBox
title: JTabbedPaneのタブにJCheckBoxを追加
tags: [JTabbedPane, JCheckBox, JPanel, JLabel]
author: aterai
pubdate: 2016-06-13T01:27:42+09:00
description: JTabbedPaneのタブ内にクリック可能なJCheckBoxを追加します。
image: https://lh3.googleusercontent.com/-b5jcwNkPYZc/V12KPOBZsFI/AAAAAAAAObI/5fJ6EGqkXMg7fYFyLSDa_MwGJ3hXZGE-QCCo/s800/TabWithCheckBox.png
---
* 概要 [#summary]
`JTabbedPane`のタブ内にクリック可能な`JCheckBox`を追加します。

#download(https://lh3.googleusercontent.com/-b5jcwNkPYZc/V12KPOBZsFI/AAAAAAAAObI/5fJ6EGqkXMg7fYFyLSDa_MwGJ3hXZGE-QCCo/s800/TabWithCheckBox.png)

* サンプルコード [#sourcecode]
#code(link){{
JTabbedPane tabs = new JTabbedPane() {
  @Override public void addTab(String title, Component content) {
    super.addTab(title, content);
    JCheckBox check = new JCheckBox();
    check.setOpaque(false);
    check.setFocusable(false);
    JPanel p = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
    p.setOpaque(false);
    p.add(check, BorderLayout.WEST);
    p.add(new JLabel(title));
    setTabComponentAt(getTabCount() - 1, p);
  }
};
}}

* 解説 [#explanation]
上記のサンプルでは、`JDK 6`で追加された`JTabbedPane`のタブにコンポーネントを配置する機能を使用して`JCheckBox`を各タブの内部に追加しています。

- 直接`JCheckBox`を`JTabbedPane#setTabComponentAt(...)`で追加するのではなく、タブタイトルを`JLabel`に分離してチェックアイコンのみの`JCheckBox`と合わせて`JPanel`に配置
- タブタイトル文字列を`JCheckBox#setText(...)`で設定した`JCheckBox`を`JTabbedPane#setTabComponentAt(...)`で追加するのではなく、タブタイトル用の`JLabel`とチェックアイコンのみの`JCheckBox`に分割して`JPanel`に配置
- タブタイトル文字列用の`JLabel`はクリックイベントを処理しないよう設定
- このためタブタイトルをクリックしても別コンポーネントである`JCheckBox`のチェック状態は変化せずタブの切り替えが実行される

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTabbedPane.html#setTabComponentAt-int-java.awt.Component- JTabbedPane#setTabComponentAt(...) (Java Platform SE 8)]

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