• 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

概要

Iconを指定した数の四分円(90度)だけ回転してJLabelに配置します。

サンプルコード

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();
  }
}
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント