好的,所以当我想使用透明度时,我偶然发现了这个问题。

因此,用于更改悬停背景的代码是这样的...

 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的背景色会引起问题。

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

java - 在JButton上悬停时出现奇怪的颜色变化-LMLPHP

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);
    }

}

10-06 07:28