Применение цвета к прозрачной области изображения JButton, но не к его контейнеру
У меня есть круговой JButton, построенный с использованием круглого PNG-изображения с прозрачной областью.
Я хочу заполнить прозрачную область изображения JButton заданным цветом - но чем-то, кроме непрозрачного цвета фона JPanel, который содержит JButton. Я хочу сделать это программно на Java, а не предоставлять предварительно окрашенные изображения из графического пакета.
Я получил код ниже, который просто позволяет оранжевому фону непрозрачной панели окрашивать прозрачную область. Однако я не могу понять, как сохранить фон панели оранжевым, но залить прозрачность изображения, скажем, синим (или другим цветом для эффектов прокрутки и нажатия).
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");
}
}
Я предполагаю, что мне может понадобиться применить преобразования Graphics2D к моему прозрачному изображению, чтобы создать набор из трех новых изображений (для нормального, опрокидывающегося и нажатого состояний моего JButton). Это подходящий путь вперед, и если да, можете ли вы предоставить мне пример кода для части, которую я пропускаю?
Спасибо