---
category: swing
folder: LayoutAnimation
title: LayoutManagerを使ってパネルの展開アニメーションを行う
tags: [LayoutManager, Animation, BorderLayout, JTree, JPanel]
author: aterai
pubdate: 2010-11-22T14:41:14+09:00
description: パネルの展開・収納をアニメーションで行うLayoutManagerを作成します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTO_fTHG-I/AAAAAAAAAdQ/9SHzG18aVW0/s800/LayoutAnimation.png
---
* Summary [#summary]
パネルの展開・収納をアニメーションで行う`LayoutManager`を作成します。
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTO_fTHG-I/AAAAAAAAAdQ/9SHzG18aVW0/s800/LayoutAnimation.png)
* Source Code Examples [#sourcecode]
#code(link){{
private Timer animator;
private boolean isHidden = true;
private final JPanel controls = new JPanel(new BorderLayout(5, 5) {
private int controlsHeight;
private int controlsPreferredHeight;
@Override public Dimension preferredLayoutSize(Container target) {
// synchronized (target.getTreeLock()) {
Dimension ps = super.preferredLayoutSize(target);
controlsPreferredHeight = ps.height;
if (animator != null) {
if (isHidden) {
if (controls.getHeight() < controlsPreferredHeight) {
controlsHeight += 5;
}
} else {
if (controls.getHeight() > 0) {
controlsHeight -= 5;
}
}
if (controlsHeight <= 0) {
controlsHeight = 0;
animator.stop();
} else if (controlsHeight >= controlsPreferredHeight) {
controlsHeight = controlsPreferredHeight;
animator.stop();
}
}
ps.height = controlsHeight;
return ps;
}
});
private Action makeShowHideAction() {
return new AbstractAction("Show/Hide Search Box") {
@Override public void actionPerformed(ActionEvent e) {
if (animator != null && animator.isRunning()) {
return;
}
isHidden = controls.getHeight() == 0;
animator = new Timer(5, new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
controls.revalidate();
}
});
animator.start();
}
};
}
}}
* Description [#explanation]
* Description [#description]
- `Timer`を使用して`5ms`ごとに子パネルの高さを更新
- `LayoutManager#preferredLayoutSize(...)`メソッドをオーバーライドして子パネルの高さの変更を展開アニメーションとして表現
- 内部の`JTree`の高さを縮小せずに重ねる状態で検索パネルを表示する場合は`BorderLayout`ではなく`OverlayLayout`を[[JTextAreaをキャプションとして画像上にスライドイン>Swing/EaseInOut]]のように使用する方法がある
* Reference [#reference]
- [[JTreeのノードを検索する>Swing/SearchBox]]
-- `JTree`のノードを検索するサンプル
- [[JTextAreaをキャプションとして画像上にスライドイン>Swing/EaseInOut]]
* Comment [#comment]
#comment
#comment