【问题标题】:Weird color changes on hovering on JButton悬停在 JButton 上时出现奇怪的颜色变化
【发布时间】:2016-05-30 02:51:12
【问题描述】:

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

所以改变悬停背景的代码是这样的......

 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

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

【问题讨论】:

  • 我很确定这段代码不会编译 received.setBackground(new Color(50,50,50,100);
  • 为什么不能编译?
  • 我已经添加了缺少的括号..
  • Swing 无法处理基于 alpha 的颜色,您需要进一步“伪造”它
  • 你怎么能这样做...?你能发布一个例子吗...

标签: java swing colors jbutton mouselistener


【解决方案1】:

基本上,Swing 只知道如何绘制透明和不透明组件,它不知道如何处理半透明组件,因此使用基于 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);
    }

}

【讨论】:

  • 问题:设置setOpaque(false); 并覆盖isOpaque() 以返回false 有必要吗?
  • @TT。不,其中一个会起作用,我可能会考虑将isOpaque留在那里以防止人们更改它,这可能会导致更多问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2018-09-28
  • 2013-08-22
  • 2022-01-03
相关资源
最近更新 更多