有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

但是,按钮仍在其周围的矩形中检测事件。是否有一种方法将检测限制为仅包含不透明像素的区域(或者说而不是检测透明像素上的事件)

按钮类的代码如下

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();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    我建议使用MouseAdapter,并重写mouseClicked(..)。在mouseClicked中,检查单击点处的像素是否为alpha,如果为“不做任何事情”,如果为“不做任何事情”

    • 始终将super.paintComponent(..)作为重写的paintComponent方法中的第一个调用调用,但因为,特别是使用按钮,这将在JButton实例上重新绘制JButton后台调用setContentAreaFilled(false),以停止此操作。您也可能需要setBorderPainted(false)

    下面是我举的一个小例子(改编自here):

    enter image description here

    如果单击“笑脸”:

    enter image description here

    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);
        }
    }