Swing/ListCellAnimation のバックアップの現在との差分(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/ListCellAnimation へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JListのセルのアニメーション #navi(../) *JListのセルのアニメーション [#gfab1816] >編集者:[[Terai Atsuhiro>terai]]~ 作成日:2006-11-27~ 更新日:&lastmod; --- category: swing folder: ListCellAnimation title: JListのセルのアニメーション tags: [JList, ListCellRenderer, Animation] author: aterai pubdate: 2006-11-27T14:03:02+09:00 description: JListの選択されたセルをアニメーションさせます。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPa7B8VkI/AAAAAAAAAd8/uLpJ50Oxwf8/s800/ListCellAnimation.png --- * 概要 [#summary] `JList`の選択されたセルをアニメーションさせます。 #contents #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPa7B8VkI/AAAAAAAAAd8/uLpJ50Oxwf8/s800/ListCellAnimation.png) **概要 [#db3c3494] JListの選択されたセルをアニメーションさせます。 * サンプルコード [#sourcecode] #code(link){{ class AnimeListCellRenderer extends JPanel implements ListCellRenderer { private static final Color selectedColor = new Color(230, 230, 255); private final AnimeIcon icon = new AnimeIcon(); private final MarqueeLabel label = new MarqueeLabel(); private final javax.swing.Timer animator; private final JList list; private boolean isRunning = false; int animate_index = -1; #screenshot public AnimeListCellRenderer(final JList l) { super(new BorderLayout()); this.list = l; animator = new Timer(80, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int i = l.getSelectedIndex(); if (isRunning = (i >= 0)) { l.repaint(l.getCellBounds(i, i)); } } }); setOpaque(true); add(icon, BorderLayout.WEST); add(label); animator.start(); } **サンプルコード [#dddb9e20] #code{{ class AnimeListCellRenderer extends JPanel implements ListCellRenderer, ActionListener { private static final Color eColor = new Color(240,240,255); private static final Color sColor = new Color(230,230,255); private final AnimeIcon icon = new AnimeIcon(); private final ScrollingLabel label = new ScrollingLabel(); private final javax.swing.Timer animator; private final JList jlist; private boolean flag = false; public AnimeListCellRenderer(JList list) { super(new BorderLayout()); jlist = list; animator = new javax.swing.Timer(100, this); animator.start(); setOpaque(true); add(icon, BorderLayout.WEST); add(label, BorderLayout.CENTER); } public Component getListCellRendererComponent(JList list, Object object, int index, boolean isSelected, boolean cellHasFocus) { flag = isSelected; setBackground(flag?sColor:index%2==0?eColor:list.getBackground()); label.setText((object==null) ? "" : object.toString()); return this; } public void actionPerformed(ActionEvent e) { jlist.repaint(); } private class ScrollingLabel extends JLabel { private float xx; public void ScrollingLabel() { setOpaque(false); } public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; ...... @Override public Component getListCellRendererComponent(JList list, Object object, int index, boolean isSelected, boolean cellHasFocus) { setBackground(isSelected ? selectedColor : list.getBackground()); label.setText((object == null) ? "" : object.toString()); animate_index = index; return this; } private boolean isAnimatingCell() { return isRunning && animate_index == list.getSelectedIndex(); } private class MarqueeLabel extends JLabel { // ... } // ... } }} -&jnlp; -&jar; -&zip; **解説 [#u20e47f0] 上記のサンプルでは、セルが選択されると左のアイコンがアニメーションし、文字列がクリップされている場合は、スクロールするようになっています。 * 解説 [#explanation] 上記のサンプルでは、セルが選択されると左のアイコンがアニメーションし、文字列が省略されている場合はスクロールするよう設定しています。 選択されたセルだけ再描画しているのではなく、ActionListener を実装したセルレンダラーを作成してJList全体をrepaintしています。 %%選択されたセルだけ再描画しているのではなく、`ActionListener`を実装したセルレンダラーを作成して`JList`全体を`repaint`しています。%% 選択されたセルだけ再描画してアニメーションを行っています。 **参考リンク [#e65685cf] -[[Timerでアニメーションするアイコンを作成>Swing/AnimeIcon]] -[[GlyphVectorで文字列を電光掲示板風にスクロール>Swing/ScrollingMessage]] * 参考リンク [#reference] - [[Timerでアニメーションするアイコンを作成>Swing/AnimeIcon]] - [[GlyphVectorで文字列を電光掲示板風にスクロール>Swing/ScrollingMessage]] **コメント [#x428be3b] * コメント [#comment] #comment - 選択されたセルのみ再描画、`JScrollPane`に対応、スクリーンショット更新。 -- &user(aterai); &new{2008-05-13 (火) 14:53:51}; #comment