Swing/LayoutAnimation のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LayoutAnimation へ行く。
- 1 (2010-11-22 (月) 14:41:14)
- 2 (2010-12-07 (火) 11:26:36)
- 3 (2010-12-17 (金) 21:18:30)
- 4 (2011-06-28 (火) 17:10:05)
- 5 (2011-09-27 (火) 19:24:41)
- 6 (2012-12-25 (火) 05:07:52)
- 7 (2014-12-05 (金) 02:23:01)
- 8 (2015-03-02 (月) 11:26:13)
- 9 (2016-05-27 (金) 15:29:56)
- 10 (2017-08-24 (木) 12:57:48)
- 11 (2018-09-07 (金) 16:40:36)
- 12 (2019-09-25 (水) 21:25:24)
- 13 (2021-05-11 (火) 01:25:08)
- 14 (2022-08-01 (月) 14:05:52)
- title: LayoutManagerを使ってパネルの展開アニメーションを行う tags: [LayoutManager, Animation, BorderLayout, JTree, JPanel] author: aterai pubdate: 2010-11-22T14:41:14+09:00 description: パネルの展開・収納をアニメーションで行うLayoutManagerを作成します。
概要
パネルの展開・収納をアニメーションで行うLayoutManager
を作成します。
Screenshot
Advertisement
サンプルコード
private javax.swing.Timer animator = null;
private boolean isHidden = true;
private final JPanel controls = new JPanel(new BorderLayout(5, 5) {
private int controlsHeight = 0;
private int controlsPreferredHeight = 0;
@Override public Dimension preferredLayoutSize(Container target) {
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 javax.swing.Timer(5, new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
controls.revalidate();
}
});
animator.start();
}
};
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、LayoutManager#preferredLayoutSize(...)
をオーバーライドして、パネルの高さを更新するアニメーションを行っています。
内部のJTree
の高さを縮小せずに、重ねる状態で検索パネルを表示したい場合は、BorderLayout
ではなく、OverlayLayout
をJTextAreaをキャプションとして画像上にスライドインのように使用する方法があります。
参考リンク
- JTreeのノードを検索する
- このサンプルで省略した、実際に
JTree
のノードを検索するコードはこちらにあります。
- このサンプルで省略した、実際に
- JTextAreaをキャプションとして画像上にスライドイン