• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*JPanelの展開と折りたたみ [#f49f27f2]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-11-01~
更新日:&lastmod;
---
category: swing
folder: ExpandablePanel
title: JPanelの展開と折り畳み
tags: [JPanel, BorderLayout]
author: aterai
pubdate: 2004-11-01T01:05:24+09:00
description: JPanelにBorderLayoutを設定し、JButtonのクリックで子コンポーネントの配置を入れ替えることで、それらの展開と折り畳みを行います。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTMQbS7ipI/AAAAAAAAAY4/xXDc9VVk87A/s800/ExpandablePanel.png
---
* 概要 [#summary]
`JPanel`に`BorderLayout`を設定し、`JButton`のクリックで子コンポーネントの配置を入れ替えることで、それらの展開と折り畳みを行います。

#contents
**概要 [#iaf19b7f]
JPanelの展開と折りたたみを行います。
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTMQbS7ipI/AAAAAAAAAY4/xXDc9VVk87A/s800/ExpandablePanel.png)

http://terai.xrea.jp/swing/expandablepanel/screenshot.png
* サンプルコード [#sourcecode]
#code(link){{
private void initComps(
    List<? extends AbstractExpansionPanel> list,
    JComponent source) {
  setVisible(false);
  centerBox.removeAll();
  northBox.removeAll();
  southBox.removeAll();
  boolean insertSouth = false;
  for (AbstractExpansionPanel exp : list) {
    if (source.equals(exp) && exp.isSelected()) {
      centerBox.add(exp);
      insertSouth = true;
      continue;
    }
    exp.setSelected(false);
    if (insertSouth) {
      southBox.add(exp);
    } else {
      northBox.add(exp);
    }
  }
  setVisible(true);
}
}}

**サンプルコード [#l8c5ce79]
 public void initComps(Vector panelList, ExpansionEvent e) {
   setVisible(false);
   centerBox.removeAll();
   northBox.removeAll();
   southBox.removeAll();
   ExpansionPanel es = (ExpansionPanel) e.getSource();
   boolean southFlag = false;
   for(Iterator it=panelList.iterator();it.hasNext();) {
     ExpansionPanel exp = (ExpansionPanel) it.next();
     if(exp==es && exp.isSelected()) {
       centerBox.add(exp);
       southFlag = true;
     }else if(southFlag) {
       exp.setSelected(false);
       southBox.add(exp);
     }else{
       exp.setSelected(false);
       northBox.add(exp);
     }
   }
   setVisible(true);
 }
* 解説 [#explanation]
- 各`JButton`が押されるたびに対象パネルの展開(子コンポーネントの追加)と折り畳み(子コンポーネントの削除)を実行
-- 同時に`BorderLayout`の`NORTH`、`CENTER`、`SOUTH`に各パネルを振り分け
-- 展開されるパネル一つだけが推奨サイズ(`PreferredSize`)が無視されて任意の高さに拡張される`CENTER`に配置

-[[サンプルを起動>http://terai.xrea.jp/swing/expandablepanel/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/expandablepanel/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/expandablepanel/src.zip]]
**解説 [#vc8a1e60]
上記のサンプルでは、ボタンが押されるたびにそのパネルの展開と折りたたみを行い、同時にBorderLayoutの北、中央、南に各パネルを振り分けています。このため展開されるパネルはひとつだけになります。
**参考リンク [#l2299305]
-[[JPanelをアコーディオン風に展開>Swing/AccordionPanel]]
* 参考リンク [#reference]
- [[JPanelをアコーディオン風に展開>Swing/AccordionPanel]]

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