• category: swing folder: AnimatedTreeNode title: JTreeのTreeNodeにAnimated GIFを表示する tags: [JTree, ImageIcon, ImageObserver, Animation] author: aterai pubdate: 2016-06-27T01:54:58+09:00 description: JTreeのノードに設定したAnimated GIFのImageIconがアニメーションを行えるようにImageObserverを設定します。 image: https://lh3.googleusercontent.com/-U9WtOD4nOug/V3AE4msfadI/AAAAAAAAOcY/VDwIROM5Ju4gNFBm47FDBJTOtIazp7iyACCo/s800/AnimatedTreeNode.png

概要

JTreeのノードに設定したAnimated GIFImageIconがアニメーションを行えるようにImageObserverを設定します。

サンプルコード

TreePath path = new TreePath(s1.getPath());
//Wastefulness: icon.setImageObserver((ImageObserver) tree);
icon.setImageObserver(new ImageObserver() {
  @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) {
    if (!tree.isShowing()) {
      return false;
    }
    Rectangle cellRect = tree.getPathBounds(path);
    if ((infoflags & (FRAMEBITS | ALLBITS)) != 0 && Objects.nonNull(cellRect)) {
      tree.repaint(cellRect);
    }
    return (infoflags & (ALLBITS | ABORT)) == 0;
  }
});
View in GitHub: Java, Kotlin

解説

  • Default
    • DefaultMutableTreeNodeUserObjectとしてAnimated GIF画像から生成したImageIconを設定し、これをDefaultTreeCellRenderer#setIcon(...)でノードに表示
    • 自動的に再描画されないため、アニメーションが正常に行われない
  • setImageObserver
    • 同様に設定したImageIconsetImageObserver(ImageObserver)メソッドでImageObserverを追加し、正常にアニメーションが行えるように画像の更新に合わせてJTree#repaint(Rectangle)でノードを再描画
    • 再描画する領域は対象のノードのみになるよう、JTree.getPathBounds(TreePath)で取得される領域に制限

参考リンク

コメント