以下方法是通过抓取点击地方的XY坐标,并判断该坐标在图片中的象素,分析该象素的XY值后得出鼠标是否碰到该按钮了,对于很多想做出象C++,DELPHI等不规则图像按钮的兄弟绝对有用!主要代码很少,运算速度还可以,每次点击后判断的时间为0-16毫秒,我的是雷鸟2600+,512M。
本人QQ:17742639package testpack;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.borland.jbcl.layout.XYLayout;
import com.borland.jbcl.layout.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.Image;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import java.awt.image.ColorModel;public class Frame1 extends JFrame implements Runnable {
    JPanel contentPane;
    XYLayout xYLayout1 = new XYLayout();
    public Frame1() {
        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        Thread t = new Thread(this);
        t.start();
    }    Image img;
    BufferedImage bi = new BufferedImage(400, 300, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = bi.createGraphics();
    private void jbInit() throws Exception {
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(xYLayout1);
        setSize(new Dimension(400, 300));
        setTitle("Frame Title");
        this.addMouseListener(new Frame1_this_mouseAdapter(this));
        try {
            //这个图片位置改为自己电脑里面的带透明象素的图片
            img = Toolkit.getDefaultToolkit().getImage("e:\\learnJb\\h11.png");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    public void run() {
        while (true) {
            repaint();
            try {
                Thread.sleep(100);
            } catch (Exception e) {            }
        }    }    public void update(Graphics g) {
        paint(g);
    }    public void paint(Graphics g) {
        g2.drawImage(img, 0, 0, this);
        g.drawImage(bi, 0, 0, this);
    }
    //以下为主要判断方法
    public void this_mouseClicked(MouseEvent e) {
        if (e.getModifiers() == e.BUTTON1_MASK) {
            //点击的时候创建数组保存,缓冲区图像的所有象素
            int[] pixels = new int[400 * 300];
            try {
                //抓取缓冲区图像的象素到数组
                PixelGrabber pg = new PixelGrabber(bi, 0, 0, 400, 300, pixels,
                        0, 400);
                pg.grabPixels();
                //获得鼠标点击的X,Y坐标
                int x = e.getX();
                int y = e.getY();
                //获得点击区域的ALPHA值
                ColorModel cm = ColorModel.getRGBdefault();
                //注意以下计算方式,因为PIXELS是一维数组
                int alpha = cm.getAlpha(pixels[y * 400 + x]);                //如果获得点击象素的ALPHA值是0,代表没点击到真实图像
                if (alpha == 0) {
                    System.out.println("not in area");
                } else {
                    System.out.println("in area");
                }            } catch (Exception ee) {            }
        }
    }
}
class Frame1_this_mouseAdapter extends MouseAdapter {
    private Frame1 adaptee;
    Frame1_this_mouseAdapter(Frame1 adaptee) {
        this.adaptee = adaptee;
    }    public void mouseClicked(MouseEvent e) {
        adaptee.this_mouseClicked(e);
    }
}