Criando JButton personalizado a partir de imagens contendo pixels transparentes
Leia a edição 2 do que realmente estou sentindo falta para fazê-la funcionar
Atualmente, estou tentando criar alguns JButtons personalizados usando imagens criadas no photoshop que possuem um parâmetro alf
Até agora, substituir o método paint () para desenhar a imagem funcionou no sentido de que o botão é desenhado mostrando a imagem correta. Eu gostaria de melhorá-lo, tornando sua forma (área clicável) igual aos pixels visíveis na imagem (agora, se eu desenhar a borda do botão, será um quadrado).
Existe uma maneira fácil de fazer isso ou eu tenho que analisar a imagem e encontrar os pixels alfa para criar uma borda personalizad
Quais métodos eu precisaria substituir para fazê-lo funcionar da maneira que eu quer
Além disso, outra pergunta que terei mais tarde: seria melhor usar algum tipo de algoritmo para alterar as cores das imagens, para que pareçam ser clicadas quando as pessoas clicam nela ou é melhor criar um segunda imagem e desenhar aquela com o botão ativo?
Editar Acabei de ler em outra pergunta que devo redefinir paintComponent () em vez de paint (), gostaria de saber por que, já que redefinir paint () funciona be
Edit 2: Alterei tudo para garantir que meus JButtons sejam criados usando o construtor padrão com um ícone. O que estou tentando fazer é obter a posição X e Y de onde o clique foi registrado e pegar o pixel do ícone nessa posição e verificar seu canal alfa para ver se é 0 (se for, não faça nada, então faça o ação que ele deve executar).
O problema é que o canal alfa sempre retorna 255 (e azul, vermelho e verde estão em 238 em pixels transparentes). Em outros pixels, tudo retorna o valor que deveria estar retornand
Aqui está um exemplo (tente com outra imagem, se você quiser) que recria meu 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();
}
}
}
Este é apenas um palpite, mas é possível que, quando minha imagem é convertida em um ícone, ela perde sua propriedade Alpha e, portanto, não retorna o valor correto? De qualquer forma, eu realmente aprecio isso se alguém puder me ajudar e me dizer o que devo mudar para obter o valor corret
Suponho que, porque quando tento com a imagem original, o valor do canal alfa é bom, mas na verdade não posso usar essa BufferedImage porque o redimensiono, para obter os valores de canal da imagem com o original Tamanho..