• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: QuadrantRotateIcon
title: Iconを指定した数の四分円だけ回転して表示する
tags: [Icon, JLabel, AffineTransform]
author: aterai
pubdate: 2020-10-19T03:14:22+09:00
description: Iconを指定した数の四分円(90度)だけ回転してJLabelに配置します。
image: https://drive.google.com/uc?id=1pAW3bfWkPq_I3DJciSJtYVB31En8TJH3
---
* 概要 [#summary]
Iconを指定した数の四分円(90度)だけ回転してJLabelに配置します。

#download(https://drive.google.com/uc?id=1pAW3bfWkPq_I3DJciSJtYVB31En8TJH3)

* サンプルコード [#sourcecode]
#code(link){{
enum QuadrantRotate {
  CLOCKWISE(1),
  HORIZONTAL_FLIP(2),
  COUNTER_CLOCKWISE(-1);
  private final int numquadrants;
  QuadrantRotate(int numquadrants) {
    this.numquadrants = numquadrants;
  }

  public int getNumQuadrants() {
    return numquadrants;
  }
}

class QuadrantRotateIcon implements Icon {
  private final QuadrantRotate rotate;
  private final Icon icon;

  protected QuadrantRotateIcon(Icon icon, QuadrantRotate rotate) {
    this.icon = icon;
    this.rotate = rotate;
  }

  @Override public void paintIcon(Component c, Graphics g, int x, int y) {
    int w = icon.getIconWidth();
    int h = icon.getIconHeight();
    Graphics2D g2 = (Graphics2D) g.create();
    g2.translate(x, y);
    switch (rotate) {
      case CLOCKWISE:
        g2.translate(h, 0);
        break;
      case HORIZONTAL_FLIP:
        g2.translate(w, h);
        break;
      case COUNTER_CLOCKWISE:
        g2.translate(0, w);
        break;
      default:
        throw new AssertionError("Unknown QuadrantRotateIcon");
    }
    g2.transform(
        AffineTransform.getQuadrantRotateInstance(rotate.getNumQuadrants()));
    icon.paintIcon(c, g2, 0, 0);
    g2.dispose();
  }

  @Override public int getIconWidth() {
    return rotate == QuadrantRotate.HORIZONTAL_FLIP
        ? icon.getIconWidth() : icon.getIconHeight();
  }

  @Override public int getIconHeight() {
    return rotate == QuadrantRotate.HORIZONTAL_FLIP
        ? icon.getIconHeight() : icon.getIconWidth();
  }
}
}}

* 解説 [#explanation]
上記のサンプルでは`Java 1.6`で追加された`AffineTransform.getQuadrantRotateInstance(...)`メソッドを使用して`90°`単位で回転した`Icon`を作成しています。

* 参考リンク [#reference]
- [[Iconを回転する>Swing/RotatedIcon]]からこちらに移動

* コメント [#comment]
#comment
#comment