Aplicando cores à área transparente de uma imagem JButton - mas não à de seu contêiner
Eu tenho um JButton circular construído usando uma imagem PNG circular com uma área transparente.
Quero preencher a área transparente da imagem do JButton com uma determinada cor - mas algo diferente da cor opaca do JPanel que contém o JButton. Quero fazer isso programaticamente em Java, em vez de fornecer imagens pré-coloridas de um pacote gráfico.
Cheguei ao código abaixo, que simplesmente permite que o plano de fundo laranja do painel opaco colore a área transparente. No entanto, não consigo descobrir como manter o fundo do painel em laranja, mas preencher a transparência da imagem com, digamos, azul (ou outra cor para sobreposição e efeitos pressionados).
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.DefaultButtonModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class App extends JFrame implements ActionListener
{
public App()
{
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(makeContentPane());
}
private final JPanel makeContentPane()
{
JPanel contentPane = new JPanel();
BufferedImage bi = null;
try
{
bi = ImageIO.read(new URL("http://features.advisorwebsites.com/sites/default/files/users/AdvisorWebsitesFeatures/icones/1384148625_twitter_circle_gray.png"));
}
catch (IOException e)
{
e.printStackTrace();
}
ImageIcon icon = new ImageIcon(bi);
MyButton myButton = new MyButton(icon);
myButton.addActionListener(this);
contentPane.add(myButton);
contentPane.setBackground(Color.ORANGE);
contentPane.setOpaque(true);
return contentPane;
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
App app = new App();
app.pack();
app.setVisible(true);
}
});
}
class MyButton extends JButton
{
public MyButton(ImageIcon icon)
{
super(icon);
setMargin(new Insets(0, 0, 0, 0));
setFocusable(false);
setContentAreaFilled(false);
setBorderPainted(false);
setModel(new DefaultButtonModel());
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
}
@Override
public void actionPerformed(ActionEvent arg0)
{
System.out.println("You clicked me");
}
}
Suponho que talvez seja necessário aplicar as transformações Graphics2D à minha imagem transparente para criar um conjunto de três novas imagens (para os estados normal, rollover e pressionado do meu JButton). Esse é o caminho apropriado a seguir e, se houver, você pode me fornecer um exemplo de código para o bit que está faltando?
obrigado