将颜色应用于JButton图像的透明区域 - 但不是其容器的透明区域 [英] Applying colour to the transparent area of a JButton image - but not that of its container
问题描述
我有一个使用带有透明区域的圆形PNG图像构造的圆形JButton。
I have a circular JButton constructed using a circular PNG image with a transparent area.
我想用给定的颜色填充JButton图像的透明区域 - 但是包含JButton的JPanel的不透明背景颜色以外的东西。我想用Java编程,而不是从图形包中提供预先着色的图像。
I want to fill the transparent area of the JButton image with a given colour - but something other than the opaque background colour of the JPanel which contains the JButton. I want to do this programmatically in Java rather than providing pre-coloured images from a graphics package.
我已经得到了下面的代码,它只是允许不透明面板的橙色背景为透明区域着色。但是,我无法弄清楚,如何将面板背景保持为橙色,但用蓝色(或其他颜色进行翻转和按下效果)填充图像透明度。
I've got as far as the code below, which simply allows the orange background of the opaque panel to colour the transparent area. I can't figure out, though, how to keep the panel background as orange but fill the image transparency with, say, blue (or another colour for rollover and pressed effects).
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的正常,翻转和按下状态)。这是正确的前进方式,如果是这样,你能为我提供一个我缺少的代码示例吗?
I'm guessing I might need to apply Graphics2D transformations to my transparent image to create a set of three new images (for the normal, rollover and pressed states of my JButton). Is this the appropriate way forward and, if so, can you provide me with a code example for the bit I'm missing ?
谢谢
推荐答案
尝试在自定义 JButton $中覆盖
paintComponent()
c $ c>
try to override paintComponent()
in your custom JButton
以下是我的尝试
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));
}
public void paintComponent(Graphics g) {
g.setColor(Color.green);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
super.paintComponent(g);
}
}
这是结果:
编辑:
要根据鼠标移动来改变颜色,你需要将一个MouseListener添加到JButton并添加一个 Color
属性该类,当一个MouseEvent被触发时,你改变颜色。另外不要忘记在paintComponent()中将图形设置为该颜色
To get it to change color depending on mouse movement, you need to add a MouseListener to the JButton and add a Color
attribute to the class, when a MouseEvent is fired you change the color. Also don't forget to set the graphics to that color in paintComponent()
class MyButton extends JButton {
Color color = Color.GREEN;
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));
this.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
color=Color.RED;
}
@Override
public void mouseReleased(MouseEvent e) {
color=Color.BLUE;
}
@Override
public void mouseEntered(MouseEvent e) {
color=Color.BLUE;
}
@Override
public void mouseExited(MouseEvent e) {
color=Color.GREEN;
}
});
}
@Override
public void paintComponent(Graphics g) {
g.setColor(color);
g.fillOval(0, 0, this.getWidth(), this.getHeight());
super.paintComponent(g);
}
}
这篇关于将颜色应用于JButton图像的透明区域 - 但不是其容器的透明区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!