• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTabbedPaneの余白にJCheckBoxを配置
#navi(../)
*JTabbedPaneの余白にJCheckBoxを配置 [#jf5f1d6a]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-04-03~
更新日:&lastmod;
Posted by [[terai]] at 2006-04-03

#contents

**概要 [#mac165bc]
JTabbedPaneの余白にJCheckBoxを配置して特定のタブの開閉を行います。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#hd0302da]
#code{{
 class TabbedPaneWithCompBorder implements Border, MouseListener, SwingConstants {
   private final JComponent  dummy = new JPanel();;
   private final JCheckBox   cbox;
   private final JTabbedPane tab;
   private Rectangle rect;
   public TabbedPaneWithCompBorder(JCheckBox cbox, JTabbedPane tab) {
     this.cbox = cbox;
     this.tab  = tab;
     tab.addMouseListener(this);
     cbox.setFocusPainted(false);
     cbox.addMouseListener(new MouseAdapter() {
       public void mouseClicked(MouseEvent me) {
         JCheckBox cb = (JCheckBox)me.getSource();
         cb.setSelected(!cb.isSelected());
       }
     });
   }
   public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
     Dimension size = cbox.getPreferredSize();
     int xx = tab.getSize().width - size.width;
     Rectangle lastTab = tab.getUI().getTabBounds(tab, tab.getTabCount()-1);
     int tabEnd = lastTab.x + lastTab.width;
     if(xx<tabEnd) xx = tabEnd;
     rect = new Rectangle(xx, -2, size.width, size.height);
     SwingUtilities.paintComponent(g, cbox, dummy, rect);
   }
   public Insets getBorderInsets(Component c) {
     return new Insets(0,0,0,0);
   }
   public boolean isBorderOpaque() {
     return true;
   }
   private void dispatchEvent(MouseEvent me) {
     if(rect==null || !rect.contains(me.getX(), me.getY())) return;
     Point pt = me.getPoint();
     pt.translate(0, 0);
     cbox.setBounds(rect);
     cbox.dispatchEvent(new MouseEvent(
       cbox, me.getID(), me.getWhen(), me.getModifiers(),
       pt.x, pt.y, me.getClickCount(), me.isPopupTrigger(), me.getButton()));
   }
   public void mouseClicked(MouseEvent me) {
     dispatchEvent(me);
   }
   public void mouseEntered(MouseEvent me) {
     dispatchEvent(me);
   }
   public void mouseExited(MouseEvent me) {
     dispatchEvent(me);
   }
   public void mousePressed(MouseEvent me) {
     dispatchEvent(me);
   }
   public void mouseReleased(MouseEvent me) {
     dispatchEvent(me);
   }
 }
class TabbedPaneWithCompBorder implements Border, MouseListener, SwingConstants {
  private final JComponent  dummy = new JPanel();;
  private final JCheckBox   cbox;
  private final JTabbedPane tab;
  private Rectangle rect;
  public TabbedPaneWithCompBorder(JCheckBox cbox, JTabbedPane tab) {
    this.cbox = cbox;
    this.tab  = tab;
    tab.addMouseListener(this);
    cbox.setFocusPainted(false);
    cbox.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent me) {
        JCheckBox cb = (JCheckBox)me.getSource();
        cb.setSelected(!cb.isSelected());
      }
    });
  }
  public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
    Dimension size = cbox.getPreferredSize();
    int xx = tab.getSize().width - size.width;
    Rectangle lastTab = tab.getUI().getTabBounds(tab, tab.getTabCount()-1);
    int tabEnd = lastTab.x + lastTab.width;
    if(xx<tabEnd) xx = tabEnd;
    rect = new Rectangle(xx, -2, size.width, size.height);
    SwingUtilities.paintComponent(g, cbox, dummy, rect);
  }
  public Insets getBorderInsets(Component c) {
    return new Insets(0,0,0,0);
  }
  public boolean isBorderOpaque() {
    return true;
  }
  private void dispatchEvent(MouseEvent me) {
    if(rect==null || !rect.contains(me.getX(), me.getY())) return;
    Point pt = me.getPoint();
    pt.translate(0, 0);
    cbox.setBounds(rect);
    cbox.dispatchEvent(new MouseEvent(
      cbox, me.getID(), me.getWhen(), me.getModifiers(),
      pt.x, pt.y, me.getClickCount(), me.isPopupTrigger(), me.getButton()));
  }
  public void mouseClicked(MouseEvent me) {
    dispatchEvent(me);
  }
  public void mouseEntered(MouseEvent me) {
    dispatchEvent(me);
  }
  public void mouseExited(MouseEvent me) {
    dispatchEvent(me);
  }
  public void mousePressed(MouseEvent me) {
    dispatchEvent(me);
  }
  public void mouseReleased(MouseEvent me) {
    dispatchEvent(me);
  }
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#md0e801a]
JTabbedPaneのBorderにSwingUtilities.paintComponentメソッドを使ってJCheckBoxを描画しています。JCheckBoxのイベントが伝播しないようにダミーパネルを中間コンテナに指定しています。

タブとチェックボックスが重ならないように、フレームの最小サイズを設定しています。

**参考リンク [#ze3b3f0b]
-[[JTabbedPaneの余白に文字列を表示>Swing/TabbedPaneWithText]]

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