• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JComponentの形状を変更する
#navi(../)
RIGHT:Posted by [[aterai]] at 2008-11-17
RIGHT:Posted by &author(aterai); at 2008-11-17
*JComponentの形状定義を変更する [#hda649fc]
コンポーネントの形状を画像の不透明領域に合わせて変更します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTQKdiDk4I/AAAAAAAAAfI/tb322r8ngL0/s800/MoveNonRectangularImage.png)

**サンプルコード [#h071e116]
#code{{
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);
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) {
  public boolean contains(int x, int y) {
  @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;
  public void mousePressed(MouseEvent me) {
  @Override public void mousePressed(MouseEvent me) {
    start = me.getPoint();
  }
  public void mouseDragged(MouseEvent me) {
  @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);
}}

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

**参考リンク [#va0cebde]
-[https://duke.dev.java.net/images/iconSized/index.html duke - Files in images - iconSized]
-[[JButtonの形を変更>Swing/RoundButton]]
-[[ImageIconの形でJButtonを作成>Swing/RoundImageButton]]

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