hover在JButton上时出现奇怪的颜色变化

好的,这是我在想要使用透明度时偶然发现的一个问题。

所以改变hover背景的代码就是这个……

received.setMouseListener(new MouseAdapter() @Override public void mouseEntered(MouseEvent me) { received.setBackground(new Color(50,50,50,100)); } }); 

一开始我为按钮设置了蓝色..

这是显示颜色变化的GIF ……

GifMeme09541718022016.gif https://drive.google.com/file/d/0B9XFyaTVy8oYci1zMmRhMmtYcnM/view?usp=docslist_api

为什么会这样? 如果这不是正确的方法,那么正确的方法是什么?

基本上,Swing只了解如何绘制透明和不透明的组件,它不知道如何处理半透明组件,因此使用基于alpha的背景颜色会导致问题。

相反,你需要通过控制组件背景的绘制方式来“伪造”它,例如……

基于Alpha的悬停

 public class FakeTransperencyButton extends JButton { private float alpha = 0; public FakeTransperencyButton(String text) { super(text); setOpaque(false); setBackground(Color.RED); addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { alpha = 0.4f; repaint(); } @Override public void mouseExited(MouseEvent e) { alpha = 0f; repaint(); } }); } @Override public boolean isOpaque() { return false; } public float getAlpha() { return alpha; } protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setComposite(AlphaComposite.SrcOver.derive(getAlpha())); g2d.setColor(getBackground()); g2d.fillRect(0, 0, getWidth(), getHeight()); g2d.dispose(); super.paintComponent(g); } }