TITLE:JComponentの形状を変更する

Posted by at 2008-11-17

JComponentの形状定義を変更する

コンポーネントの形状を画像の不透明領域に合わせて変更します。

  • &jnlp;
  • &jar;
  • &zip;
MoveNonRectangularImage.png

サンプルコード

ImageIcon i = new ImageIcon(getClass().getResource("duke.gif"));
Dimension d = new Dimension(i.getIconWidth(), i.getIconHeight());
final BufferedImage image = new BufferedImage(
    d.width,d.height,BufferedImage.TYPE_INT_ARGB);
Graphics g = image.createGraphics();
i.paintIcon(null,g,0,0);
g.dispose();
final JLabel icon = new JLabel(i) {
  @Override public boolean contains(int x, int y) {
    return super.contains(x, y) && ((image.getRGB(x, y) >> 24) & 0xff) > 0;
  }
};
icon.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
MouseAdapter l = new MouseAdapter() {
  private Point start;
  private Point loc;
  @Override public void mousePressed(MouseEvent me) {
    start = me.getPoint();
  }
  @Override public void mouseDragged(MouseEvent me) {
    loc = icon.getLocation(loc);
    int x = loc.x - start.x + me.getX();
    int y = loc.y - start.y + me.getY();
    icon.setLocation(x, y);
  }
};
icon.addMouseListener(l);
icon.addMouseMotionListener(l);

解説

上記のサンプルでは、非矩形画像の不透明部分だけマウスでドラッグできるように、マウス処理にUIが使用する contains メソッドをオーバーライドし、透明部分がJLabelの形状に含まれないようにしています。

参考リンク

コメント