JPanel在更改背景时无法保持颜色的alpha值。

3

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

自定义GUI按钮

所在的GUI -- 查看第158行。

3个回答

2

有两个问题需要注意

  1. Swing不支持基于Alpha的颜色,Swing组件要么是不透明的,要么是透明的。为了解决这个问题,你需要将组件设置成透明的,并重写paintComponent方法,使用AlphaComposite填充它,否则Swing会认为你的组件应该被绘制在其他组件上面而导致更多绘制问题。
  2. 在你的TranslucentPanel中,你允许组件绘制背景,并再次用一个半透明版本来填充它,导致重复。你需要将这个组件设置为透明的。

我建议首先修改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);
}

示例

我强烈建议您停止使用null布局,并学习如何使用适当的布局管理器,它们将使您的生活更简单。

请参阅在容器内布置组件了解更多详情。


我已经添加了这个,但按钮的行为似乎没有任何变化。我还注意到该窗格没有像应该的那样变成不透明。我已经推送了新代码,这样你就可以看到我正在进行的工作了。 - Cyphereion
抱歉,应该是 setOpaque(alpha == 1.0f); 而不是 setOpaque(alpha != 1.0f); - 星期一早上:P - MadProgrammer
这似乎仍然没有起作用。按钮仍然非常缓慢地失去所有透明度。我应该如何处理 alpha 值?我尝试在设置颜色之前将面板设置为透明,但它仍然会出现相同的问题。我需要同时更改按钮使用的面板吗? - Cyphereion
如果您正在为按钮应用带有 alpha 值的颜色,则会遇到与“panel_Bottom”中描述的相同问题,因此您需要设计类似的解决方案。在没有使它们透明(setOpaque)之前,您无法使用基于 alpha 的颜色来处理 Swing 组件,但是然后您需要覆盖它们的 paintComponent 方法,以确保它们实际上仍在绘制它们的背景。 - MadProgrammer
这很完美。使用Synthetica UI测试过。+1。 - m4heshd

0
你的GUI-Button第50行出现错误 - 由于错别字,你的背景设置器有缺陷。
所以,如果你想将你的背景设置为新颜色,什么也不会发生。
但我认为你透明度的问题来自GuiSettings中的199行 - 在那里,你设置了一个组合值,每次调用后使你的像素变得“更暗”。(原因是调用导出方法并使用0.85f作为参数)
希望我能帮到你。

那不是问题所在。如果您查看GUIButton,您会看到我正在使用标准JPanel。至于类型错误,我已经修复了。只是它不在最新的提交中。 - Cyphereion

0
按钮仍然非常缓慢地失去了所有的透明度。
请查看带有透明度的背景,了解可能的问题和解决方案。
基本上,您需要确保父组件的背景先被绘制,然后再绘制透明背景,否则您会遇到所描述的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接