Swing/MoveNonRectangularImage の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/MoveNonRectangularImage へ行く。
- Swing/MoveNonRectangularImage の差分を削除
--- 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