JPanel在更改背景时不保持颜色alpha

时间:2015-06-28 21:47:47

标签: java swing colors jpanel

jpanel的背景色会变得比以前更加不透明。值得注意的是我正在使用jpanel的setBackground方法。以下是您可能想要查看的代码的一些链接。

Custom GUI Button

The Gui it's in - 请看第158行。

3 个答案:

答案 0 :(得分:2)

弹出两件事

  1. Swing不支持基于alpha的颜色,Swing组件不透明或透明。你必须假装它,通过使组件透明,然后覆盖paintComponent并使用AlphaCompositeto填充它,否则Swing将不知道它应该在你的组件下绘画,你最终会结束一堆更多的油漆问题
  2. 在你的TranslucentPanel中,你允许组件绘制其背景,然后再用半透明版本填充它,加倍。您需要将此组件设置为透明
  3. 我要做的第一件事是更改TranslucentPane,以便您可以控制透明度级别,例如

    public class TranslucentPane extends JPanel {
    
        private float alpha = 1f;
    
        public TranslucentPane() {
        }
    
        public void setAlpha(float value) {
            if (alpha != value) {
                alpha = Math.min(Math.max(0f, value), 1f);
                setOpaque(alpha == 1.0f);
                repaint();
            }
        }
    
        public float getAlpha() {
            return alpha
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
    
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setComposite(AlphaComposite.SrcOver.derive(getAlpha()));
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.dispose();
    
        }
    
    }
    

    接下来,我会更改panel_Bottom以实际使用它...

    private TranslucentPane panel_Bottom;
    
    //...
    
    panel_Bottom = new TranslucentPane();
    panel_Bottom.setBorder(new LineBorder(new Color(0, 0, 0)));
    if(isTransparent){
        panel_Bottom.setAlpha(0.85f);
    }
    

    Example

    我还强烈建议您停止使用null布局并学习如何使用合适的布局管理器,这样可以简化您的生活

    有关详细信息,请查看Laying Out Components Within a Container

答案 1 :(得分:0)

GUI-Button第50行出错 - 由于输入错误,你的背景设置器有缺陷。

因此,如果您想将背景设置为新颜色,则不会发生任何事情。

但我认为你的透明度问题来自GuiSettings中的第199行 - 在那里你设置了一个复合值,使你的像素在每次调用后变得“更暗”。 (原因是派生方法的调用 以0.85f为参数)

希望我能帮到你

答案 2 :(得分:0)

  

按钮仍然非常缓慢地失去了所有透明度。

查看Backgrounds With Transparency可能存在的问题和解决方案。

基本上,您需要确保在绘制透明背景之前先绘制父组件的背景,否则您会遇到所描述的问题。