Iconを指定した数の四分円だけ回転して表示する
Total: 2029
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
Icon
を指定した数の四分円(90
度)だけ回転してJLabel
に配置します。
Screenshot
Advertisement
サンプルコード
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
を作成しています。
Default: 0
- 回転なしのアイコン
CLOCKWISE
:90
(時計回りに1
四分円、90
度回転)- 左上を原点に
90
度回転し元Icon
の高さだけx
軸プラス方向に移動
- 左上を原点に
HORIZONTAL_FLIP
:180
(時計回りに2
四分円、180
度回転)- 上下反転と同等
COUNTER_CLOCKWISE
:-90
(反時計回りに1
四分円、-90
度回転)- 左上を原点に
270
度回転し、元Icon
の幅だけy
軸プラス方向に移動
- 左上を原点に
参考リンク
- Iconを回転するからこちらに移動
- AffineTransform#getQuadrantRotateInstance(int) (Java Platform SE 8)
- 四分円(回転させる
90
度の弧)の数は負で指定しても可
- 四分円(回転させる