JButton中不透明像素的事件检测

我有一个扩展JButton的类,我正在尝试将.png图像应用到。 图像形状不规则,并被透明像素包围。 我已经覆盖了JButtonpaintComponent()方法,将我的缓冲图像应用于按钮。 现在,图像是唯一被绘制的东西,这就是我想要的。

但是,该按钮仍在检测周围矩形中的事件。 有没有办法将检测限制在仅包含不透明像素的区域(或者更确切地说检测透明像素上的事件)?

按钮类的代码如下。

 public class DrawButton extends JButton{ private BufferedImage bi; public DrawButton(BufferedImage bi){ setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight())); this.bi = bi; } @Override protected void paintComponent(Graphics g){ g.drawImage(bi, 0, 0, null); g.dispose(); } } 

好吧,我建议使用MouseAdapter ,并覆盖mouseClicked(..) 。 在mouseClicked检查像素在点击点是否为alpha ,如果它什么也不做,如果没有做什么。

  • 始终将super.paintComponent(..)作为覆盖paintComponent方法中的第一个调用,但因为,特别是对于按钮,这将重新绘制JButton实例上的JButton背景调用setContentAreaFilled(false)以停止此操作。 您可能也想要setBorderPainted(false)

这是我做的一个小例子(改编自这里 ):

在此处输入图像描述

如果点击笑脸:

在此处输入图像描述

 import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class TransparentButton { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyButton button = null; try { button = new MyButton(scaleImage(100, 100, ImageIO.read(new URL("http://2.bp.blogspot.com/-eRryNji1gQU/UCIPw0tY5bI/AAAAAAAASt0/qAvERbom5N4/s1600/original_smiley_face.png")))); } catch (Exception ex) { ex.printStackTrace(); } button.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent me) { super.mouseClicked(me); MyButton mb = ((MyButton) me.getSource()); if (!isAlpha(mb.getIconImage(), me.getX(), me.getY())) { JOptionPane.showMessageDialog(frame, "You clicked the smiley"); } } private boolean isAlpha(BufferedImage bufImg, int posX, int posY) { int alpha = (bufImg.getRGB(posX, posY) >> 24) & 0xFF; return alpha == 0; } }); frame.add(button); frame.pack(); frame.setVisible(true); } }); } public static BufferedImage scaleImage(int w, int h, Image img) throws Exception { BufferedImage bi; bi = new BufferedImage(w, h, BufferedImage.TRANSLUCENT); Graphics2D g2d = (Graphics2D) bi.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g2d.drawImage(img, 0, 0, w, h, null); return bi; } } class MyButton extends JButton { BufferedImage icon; MyButton(BufferedImage bi) { this.icon = ((BufferedImage) bi); setContentAreaFilled(false); } @Override public Dimension getPreferredSize() { return new Dimension(icon.getWidth(), icon.getHeight()); } public BufferedImage getIconImage() { return icon; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(icon, 0, 0, this); } }