#navi(../)
*JPanelをアコーディオン風に展開 [#f49f27f2]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-11-08~
更新日:&lastmod;

#contents
**概要 [#iaf19b7f]
JPanelの展開、折りたたみをアコーディオン風に行います。

http://terai.xrea.jp/swing/accordionpanel/screenshot.png

**サンプルコード [#l8c5ce79]
 public ExpansionPanel(String title_) {
   title = title_;
   label = new JLabel("↓ "+title) {
     protected void paintComponent(Graphics g) {
       Graphics2D g2 = (Graphics2D)g;
       Insets ins = getInsets();
       g2.setPaint(new GradientPaint(50, 0, Color.white,
                   getWidth(), getHeight(), new Color(200,200,255)));
       g2.fillRect(0, 0, getWidth(), getHeight());
       super.paintComponent(g);
     }
   };
   label.addMouseListener(new MouseAdapter() {
     public void mousePressed(MouseEvent evt) {
       openFlag = !openFlag;
       initPanel();
       fireExpansionEvent();
     }
   });
   label.setForeground(Color.blue);
   label.setBorder(BorderFactory.createEmptyBorder(2,5,2,2));
   panel = makePanel();
   panel.setOpaque(true);
   Border outBorder = BorderFactory.createMatteBorder(0,2,2,2,Color.white);
   Border inBorder  = BorderFactory.createEmptyBorder(10,10,10,10);
   Border border    = BorderFactory.createCompoundBorder(outBorder, inBorder);
   panel.setBorder(border);
   panel.setBackground(new Color(240, 240, 255));
   setLayout(new BorderLayout());
   add(label, BorderLayout.NORTH);
 }

-[[サンプルを起動>http://terai.xrea.jp/swing/accordionpanel/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/accordionpanel/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/accordionpanel/src.zip]]

**解説 [#vc8a1e60]
各パネルはラベルが押されるたびに自身の展開や折りたたみを行い、高さが変更されます。このとき、SpringLayoutを使って全体のレイアウトをやり直しているため、JScrollPaneの中で複数のパネルが開けるようになっています。

**参考リンク [#bf958cfb]
-[[JPanelの展開と折りたたみ>Swing/ExpandablePanel]]
-[[SpringLayoutでリスト状に並べる>Swing/SpringLayout]]

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