Swing/ListCellAnimation の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ListCellAnimation へ行く。
- Swing/ListCellAnimation の差分を削除
--- 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`の選択されたセルをアニメーションさせます。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPa7B8VkI/AAAAAAAAAd8/uLpJ50Oxwf8/s800/ListCellAnimation.png) * サンプルコード [#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; 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(); } @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(); } int animate_index = -1; private class MarqueeLabel extends JLabel { // ... } // ... } }} * 解説 [#explanation] 上記のサンプルでは、セルが選択されると左のアイコンがアニメーションし、文字列が省略されている場合はスクロールするよう設定しています。 %%選択されたセルだけ再描画しているのではなく、`ActionListener`を実装したセルレンダラーを作成して`JList`全体を`repaint`しています。%% 選択されたセルだけ再描画してアニメーションを行っています。 * 参考リンク [#reference] - [[Timerでアニメーションするアイコンを作成>Swing/AnimeIcon]] - [[GlyphVectorで文字列を電光掲示板風にスクロール>Swing/ScrollingMessage]] * コメント [#comment] #comment - 選択されたセルのみ再描画、`JScrollPane`に対応、スクリーンショット更新。 -- &user(aterai); &new{2008-05-13 (火) 14:53:51}; #comment