gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:05:56 25 4
gpt4 key购买 nike

我有一个扩展 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();
}
}

最佳答案

好吧,我建议使用MouseAdapter,并覆盖mouseClicked(..)。在mouseClicked中检查点击点处的像素是否为alpha,如果不执行任何操作,如果不执行某些操作。

  • 始终调用 super.paintComponent(..) 作为重写 paintComponent 方法中的第一个调用,但因为,特别是对于按钮,这将重绘 JButtonJButton 实例上后台调用 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);
}
}

关于java - JButton 中不透明像素的事件检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13825123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com