Création d’un JButton personnalisé à partir d’images contenant des pixels transparents

Lisez l’édition 2 de ce qui me manque pour le faire fonctionner

J’essaie actuellement de créer des boutons de commande personnalisés à l’aide d’images créées dans Photoshop avec un paramètre alpha.

Jusqu’ici, le remplacement de la méthode paint () pour dessiner l’image a fonctionné dans le sens où le bouton est dessiné avec la bonne image. J’aimerais cependant l’améliorer en rendant sa forme (zone cliquable) identique à celle des pixels visibles de l’image (maintenant si je dessine la bordure du bouton, c’est un carré).

Y a-t-il un moyen facile de faire cela ou dois-je parsingr l’image et trouver les pixels alpha pour créer une bordure personnalisée?

Quelles méthodes devrais-je remplacer pour que cela fonctionne comme je le souhaite?

En outre, une autre question que je vais poser plus tard: serait-il préférable d’utiliser une sorte d’algorithme pour modifier les couleurs des images afin de donner l’impression que l’utilisateur clique dessus lorsque l’on clique dessus ou il est préférable que je crée un deuxième image et dessin celui-là pendant que le bouton est actif?

Edit: Je viens de lire sur une autre question que je devrais redéfinir paintComponent () au lieu de paint (), je voudrais savoir pourquoi depuis redéfinir paint () fonctionne bien?

Edit 2: J’ai tout changé pour m’assurer que mes boutons JButtons sont créés à l’aide du constructeur par défaut avec une icône. Ce que j’essaie de faire, c’est d’obtenir les positions X et Y de l’endroit où le clic a été enregistré, puis de saisir le pixel de l’icône à cette position et de vérifier son canal alpha pour voir s’il s’agit de 0 (si c’est le cas, ne rien faire, sinon l’action qu’il est censé faire).

Le fait est que le canal alpha renvoie toujours 255 (et le bleu, le rouge et le vert sont à 238 sur les pixels transparents). Sur les autres pixels, tout retourne la valeur qu’il devrait renvoyer.

Voici un exemple (essayez avec une autre image si vous le souhaitez) qui recrée mon problème:

public class TestAlphaPixels extends JFrame { private final File FILECLOSEBUTTON = new File("img\\boutonrondX.png"); //My round button with transparent corners private JButton closeButton = new JButton(); //Creating it empty to be able to place it and resize the image after the button size is known public TestAlphaPixels() throws IOException { setLayout(null); setSize(150, 150); closeButton.setSize(100, 100); closeButton.setContentAreaFilled(false); closeButton.setBorderPainted(false); add(closeButton); closeButton.addMouseListener(new MouseListener() { public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { System.out.println("Alpha value of pixel (" + e.getX() + ", " + e.getY() + ") is: " + clickAlphaValue(closeButton.getIcon(), e.getX(), e.getY())); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }); Image imgCloseButton = ImageIO.read(FILECLOSEBUTTON); //Resize the image to fit the button Image newImg = imgCloseButton.getScaledInstance((int)closeButton.getSize().getWidth(), (int)closeButton.getSize().getHeight(), java.awt.Image.SCALE_SMOOTH); closeButton.setIcon(new ImageIcon(newImg)); } private int clickAlphaValue(Icon icon, int posX, int posY) { int width = icon.getIconWidth(); int height = icon.getIconHeight(); BufferedImage tempImage = (BufferedImage)createImage(width, height); Graphics2D g = tempImage.createGraphics(); icon.paintIcon(null, g, 0, 0); g.dispose(); int alpha = (tempImage.getRGB(posX, posY) >> 24) & 0x000000FF; return alpha; } public static void main(Ssortingng[] args) { try { TestAlphaPixels testAlphaPixels = new TestAlphaPixels(); testAlphaPixels.setVisible(true); testAlphaPixels.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } catch(IOException ioe) { ioe.printStackTrace(); } } } 

Ce que cet exemple affiche réellement

Ceci est juste une conjecture sauvage, mais est-il possible que lorsque mon image est convertie en une icône, elle perd sa propriété Alpha et ne renvoie donc pas la valeur correcte? Quoi qu’il en soit, j’apprécierais vraiment que quelqu’un puisse m’aider et me dire ce que je devrais changer pour obtenir la valeur correcte.

J’imagine que parce que lorsque je l’essaie avec l’image d’origine, la valeur du canal alpha est correcte, mais je ne peux pas utiliser BufferedImage car je le redimensionne. Par conséquent, les valeurs de canal de l’image sont à la taille d’origine. …