上記の私の質問にあるコード例を使用して、連動する不規則なエッジを持ついくつかのボタンを作成し、ボタンを適切に配置するためにヌル レイアウトを使用しています。私が遭遇している問題は、バッファリングされた画像の透明なピクセルでマウスのクリックが検出されていないにもかかわらず、ボタンがまだ長方形の形をとっていることです。これは、後でパネルに追加されたボタンが、隣接するボタンの一部をブロックすることを意味します。
私の質問は、不透明なピクセルになるまでマウスイベントを強制的に JButton の物理的な配置全体に伝播させる方法はありますか、それとも別の解決策が必要ですか? Shape を含むソリューションを見てきましたが、非常に高価に見えるため、別の方法を考えています。
JButton をそのままにしておく必要がある場合は、JButton を使用することにあまり執着していませんが、安価な解決策があればそれを見つけたいと思っています。
import java.awt.Dimension;
import java.awt.Graphics;
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 JButtonExample {
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 button1 = null, button2 = null;
try {
button1 = new MyButton(ImageIO.read(new URL("https://dl.dropbox.com/s/dxbao8q0xeuzhgz/button1.png")));
} catch (Exception ex) {
ex.printStackTrace();
}
button1.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 button 1");
}
private boolean isAlpha(BufferedImage bufImg, int posX, int posY) {
int alpha = (bufImg.getRGB(posX, posY) >> 24) & 0xFF;
return alpha == 0 ? true : false;
}
});
button1.setBounds(10, 10, 72, 77);
try {
button2 = new MyButton(ImageIO.read(new URL("https://dl.dropbox.com/s/v16kyha0ojx1gza/button2.png")));
} catch (Exception ex) {
ex.printStackTrace();
}
button2.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 button 2");
}
private boolean isAlpha(BufferedImage bufImg, int posX, int posY) {
int alpha = (bufImg.getRGB(posX, posY) >> 24) & 0xFF;
return alpha == 0 ? true : false;
}
});
button2.setBounds(65, 0, 122, 69);
frame.getContentPane().setLayout(null);
frame.add(button1);
frame.add(button2);
frame.setSize(210, 130);
frame.setVisible(true);
}
});
}
}
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, null);
g.dispose();
}
}