---
category: swing
folder: MoveNonRectangularImage
title: JComponentの形状を変更する
tags: [JComponent, JLabel, BufferedImage, DragAndDrop]
author: aterai
pubdate: 2008-11-17T16:07:53+09:00
description: マウスカーソルに反応するコンポーネントの領域をJLabelに設定した画像アイコンの不透明領域に合わせて変更します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQKdiDk4I/AAAAAAAAAfI/tb322r8ngL0/s800/MoveNonRectangularImage.png
---
* 概要 [#summary]
マウスカーソルに反応するコンポーネントの領域を`JLabel`に設定した画像アイコンの不透明領域に合わせて変更します。

#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTQKdiDk4I/AAAAAAAAAfI/tb322r8ngL0/s800/MoveNonRectangularImage.png)

* サンプルコード [#sourcecode]
#code(link){{
BufferedImage image = ImageIO.read(getClass().getResource("duke.gif"));
JLabel label = new JLabel(new ImageIcon(image)) {
  @Override public boolean contains(int x, int y) {
    return super.contains(x, y) && ((image.getRGB(x, y) >> 24) & 0xFF) > 0;
  }
};
}}

* 解説 [#explanation]
- `JLabel#contains(int, int)`メソッドをオーバーライドして与えられた座標にある画像の色成分が透明の場合は`false`を返すよう設定
- 画像の透明部分は`JLabel`に含まれないことになり`JLabel`に設定した`MouseListener`などに反応しない
- 非矩形画像の不透明部分だけがマウスでドラッグ可能になる
- 非矩形画像の不透明部分だけが以下のような`MouseListener`でドラッグ可能になる

#code{{
class ComponentMoveHandler extends MouseAdapter {
  private final Point startPt = new Point();

  @Override public void mousePressed(MouseEvent e) {
    startPt.setLocation(e.getPoint());
  }

  @Override public void mouseDragged(MouseEvent e) {
    Component c = e.getComponent();
    c.setLocation(c.getX() - startPt.x + e.getX(),
                  c.getY() - startPt.y + e.getY());
  }
}
}}

* 参考リンク [#reference]
- [http://duke.kenai.com/iconSized/index.html Duke Images: iconSized]
- [[JButtonの形を変更>Swing/RoundButton]]
- [[ImageIconの形でJButtonを作成>Swing/RoundImageButton]]

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