• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JPanelをアコーディオン風に展開
#navi(../)
*JPanelをアコーディオン風に展開 [#f49f27f2]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-11-08~
更新日:&lastmod;

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

#screenshot

**サンプルコード [#l8c5ce79]
#code{{
 public AccordionPanel(String title_) {
   title = title_;
 public AccordionPanel(String title) {
   super(new BorderLayout());
   this.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);
 }
}}
-&jnlp;
-&jar;
-&zip;

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

[[L2FProd.com - Common Components>http://common.l2fprod.com/]] にある JTaskPane で、もっときれいにパネルの展開や折りたたみをすることができるようです(アニメーション付き)。ソースも公開されているので、com.l2fprod.common.swing.JCollapsiblePane あたりを参考にしてみてください。

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

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