概要

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

スクリーンショット

Swing/QuadrantRotateIcon.png

サンプルコード

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 all

解説

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

  • Default: 0
    • 回転なしのアイコン
  • CLOCKWISE: 90(時計回りに1四分円、90度回転)
    • 左上を原点に90度回転し元Iconの高さだけX軸プラス方向に移動
  • HORIZONTAL_FLIP: 180(時計回りに2四分円、180度回転)
    • 上下反転と同等
  • COUNTER_CLOCKWISE: -90(反時計回りに1四分円、-90度回転)
    • 左上を原点に270度回転し、元Iconの幅だけY軸プラス方向に移動

参考リンク

コメント