• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTabbedPaneにタブを閉じるボタンを追加
#navi(../)
RIGHT:Posted by [[aterai]] at 2007-01-29
*JTabbedPaneにタブを閉じるボタンを追加 [#j2e3f8ab]
JDK 6 の新機能を使ってJTabbedPaneにタブを閉じるボタンを追加します。
---
category: swing
folder: TabWithCloseButton
title: JTabbedPaneにタブを閉じるボタンを追加
tags: [JTabbedPane, JButton]
author: aterai
pubdate: 2007-01-29T16:15:06+09:00
description: JDK 6の新機能を使用し、JTabbedPaneのタブ内に自身を閉じるためのボタンを追加します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTVCzHeo0I/AAAAAAAAAnA/hnMCEbHXnnw/s800/TabWithCloseButton.png
---
* 概要 [#summary]
`JDK 6`の新機能を使用し、`JTabbedPane`のタブ内に自身を閉じるためのボタンを追加します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTVCzHeo0I/AAAAAAAAAnA/hnMCEbHXnnw/s800/TabWithCloseButton.png)

//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTVCzHeo0I/AAAAAAAAAnA/hnMCEbHXnnw/s800/TabWithCloseButton.png)

**サンプルコード [#ebac5cc8]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
class CloseButtonTabbedPane extends JTabbedPane {
  private final Icon icon;
  private final Dimension buttonSize;
  public CloseButtonTabbedPane(Icon icon) {
    super();
    //icon = new CloseTabIcon();
    // icon = new CloseTabIcon();
    this.icon = icon;
    buttonSize = new Dimension(icon.getIconWidth(), icon.getIconHeight());
  }
  public void addTab(String title, final JComponent content) {

  @Override public void addTab(String title, final JComponent content) {
    JPanel tab = new JPanel(new BorderLayout());
    tab.setOpaque(false);
    JLabel label = new JLabel(title);
    label.setBorder(BorderFactory.createEmptyBorder(0,0,0,4));
    label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 4));
    JButton button = new JButton(icon);
    button.setPreferredSize(buttonSize);
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
      @Override public void actionPerformed(ActionEvent e) {
        removeTabAt(indexOfComponent(content));
      }
    });
    tab.add(label,  BorderLayout.WEST);
    tab.add(button, BorderLayout.EAST);
    tab.setBorder(BorderFactory.createEmptyBorder(2,1,1,1));
    tab.setBorder(BorderFactory.createEmptyBorder(2, 1, 1, 1));
    super.addTab(null, content);
    setTabComponentAt(getTabCount()-1, tab);
    setTabComponentAt(getTabCount() - 1, tab);
  }
}
}}

**解説 [#h1ca2f51]
JDK 6 から追加されたタブにコンポーネントを配置する機能を使って、JButtonをタブに追加しています。
* 解説 [#explanation]
- `JDK 6`で追加された[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTabbedPane.html#setTabComponentAt-int-java.awt.Component- JTabbedPane#setTabComponentAt(...)]メソッドを使用して、指定したタブ内に`JButton`を配置
-- `JButton`に`ActionListener`を追加し、クリックで`JTabbedPane#removeTabAt(...)`を実行してタブを削除
- [[以前のサンプル>Swing/TabWithCloseIcon]]に比べると実装も簡単でコードも短くなる

[[以前のサンプル>Swing/TabWithCloseIcon]]に比べると、実装も簡単でコードも短くなっています。
* 参考リンク [#reference]
- [http://www.oracle.com/technetwork/articles/javase/index-135776.html More Enhancements in Java SE 6]
- [https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTabbedPane.html#setTabComponentAt-int-java.awt.Component- JTabbedPane#setTabComponentAt(...) (Java Platform SE 8)]
- [[JTabbedPaneにタブを閉じるアイコンを追加>Swing/TabWithCloseIcon]]
- [[JTabbedPaneのTabTitleを左揃えに変更>Swing/TabTitleAlignment]]

**参考リンク [#q5a6ecdb]
-[http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/enhancements/ More Enhancements in Java SE 6]
-[http://download.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html How to Use Tabbed Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)]
-[[JTabbedPaneにタブを閉じるアイコンを追加>Swing/TabWithCloseIcon]]

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