• 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

概要

マウスカーソルに反応するコンポーネントの領域をJLabelに設定した画像アイコンの不透明領域に合わせて変更します。

サンプルコード

private JLabel makeLabelIcon(BufferedImage image) {
  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;
    }
  };
  //...
View in GitHub: Java, Kotlin

解説

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

参考リンク

コメント