Crear JButton personalizado a partir de imágenes que contienen píxeles transparentes
Lea la edición 2 de lo que realmente me falta para que funcione
Actualmente estoy tratando de crear algunos JButtons personalizados usando imágenes creadas en Photoshop que tienen un parámetro alfa.
Hasta ahora, anular el método paint () para dibujar la imagen ha funcionado en el sentido de que el botón se dibuja mostrando la imagen correcta. Sin embargo, me gustaría mejorarlo haciendo que su forma (área en la que se pueda hacer clic) sea la misma que los píxeles visibles en la imagen (en este momento, si dibujo el borde del botón, es un cuadrado).
Existe una manera fácil de hacerlo o tengo que analizar la imagen y encontrar los píxeles alfa para hacer un borde personalizado?
¿Qué métodos tendría que anular para que funcione de la manera que quiero?
También, otra pregunta que tendré más adelante: ¿sería mejor usar algún tipo de algoritmo para cambiar los colores de las imágenes para que parezca que se hace clic cuando la gente hace clic en él o es mejor que cree un segunda imagen y dibujo esa mientras el botón está activo?
Editar Acabo de leer en alguna otra pregunta que debería redefinir paintComponent () en lugar de paint (), me gustaría saber por qué desde que redefinir paint () funciona bien.
Edit 2: Cambié todo para asegurarme de que mis JButtons se crean utilizando el constructor predeterminado con un icono. Lo que estoy tratando de hacer es obtener la posición X e Y de donde se registró el clic y tomar el píxel del icono en esa posición y verificar su canal alfa para ver si es 0 (si es así, no hacer nada, de lo contrario acción que se supone que debe hacer).
La cosa es que el canal alfa siempre devuelve 255 (y azul, rojo y verde están en 238 en píxeles transparentes). En otros píxeles, todo devuelve el valor que debería devolver.
Aquí hay un ejemplo (pruébelo con otra imagen si lo desea) que recrea mi problema:
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(String[] args)
{
try
{
TestAlphaPixels testAlphaPixels = new TestAlphaPixels();
testAlphaPixels.setVisible(true);
testAlphaPixels.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
}
Esto es una suposición descabellada, pero ¿es posible que cuando mi imagen se convierta en un Icono, pierda su propiedad Alfa y, por lo tanto, no devuelva el valor correcto? De todos modos, realmente agradecería si alguien realmente pudiera ayudarme y decirme qué debería cambiar para obtener el valor correcto.
Supongo que porque cuando lo intento con la imagen original, el valor del canal alfa está bien, pero en realidad no puedo usar esa BufferedImage porque la cambio de tamaño, así que obtengo los valores de canal de la imagen con el original Talla..