Java - 在JPanel中设置透明度

21

假设我想让一个JPanel的不透明度变为20%可见?我不是指设置setOpaque(绘制或不绘制)或setVisible(显示或隐藏)......我的意思是使其成为半透明的JPanel..你知道吗?

这个可能吗?


他目前的问题措辞更好,但是他过去曾经问过一个非常类似的问题,而且他甚至接受了一个答案(供参考):https://dev59.com/_0_Ta4cB1Zd3GeqPEuA_ - Serplat
是的,那对我没用。 :( - test
2
如果你能解释一下哪里出了问题,我会帮忙的。 - trashgod
1
请参阅如何创建半透明和形状窗口 - trashgod
6个回答

25
您需要为Color对象设置“alpha”值:
panel.setBackground( new Color(r, g, b, a) );

然而,即使如此,这仍然无法正常工作,因为 Swing 无法正确地绘制透明背景,所以您需要进行自定义绘制。基本逻辑是:

JPanel panel = new JPanel()
{
    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
};
panel.setOpaque(false); // background of parent will be painted first
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);

请查看使用透明度的背景了解实际绘画问题及上述代码为何解决该问题的更多信息。该链接还包含一个可重复使用的自定义类,可以为您执行上述绘画操作。


6
"a"是指alpha设置,即不透明度。 - Paul Jowett
没错,你也可以阅读Color类的API,以获取该方法参数的完整描述。 - camickr
谢谢。我想说我很抱歉。我应该更清楚地表达。 - test
好的,但如何在包含背景图像的JPanel上实现这一点(以透过图像看到)?@janetsmith的AWTUtilities答案对于JPanels无效... - Benj

15
使用alpha属性来控制颜色的透明度。
例如:
panel.setBackground(new Color(0,0,0,64));

将创建一个带64透明度的黑色。

结果如下图所示:

sample

以下是代码

package test;

import javax.swing.*;
import java.awt.Color;
import java.awt.BorderLayout;

public class See {
    public static void main( String [] args ){
        JFrame frame = new JFrame();
        frame.setBackground( Color.orange );


        frame.add( new JPanel(){{
                        add( new JLabel("Center"));
                        setBackground(new Color(0,0,0,64));
                    }} , BorderLayout.CENTER );
        frame.add( new JLabel("North"), BorderLayout.NORTH);
        frame.add( new JLabel("South"), BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible( true );
    }
}

没有它,它看起来像这样:

setBackground( new Color( 0,0,0 )  ); // or setBackground( Color.black );

alt text


是否也可以使用图片来实现呢? - T_01

3
AWTUtilities.setWindowOpacity(aWindow, aFloat);

其中aWindow是Swing组件,aFloat是不透明度。


3
抱歉,我不明白。我不想要一个窗口的透明度,而是JPanel的透明度。 :D - test
我使用JFrame,它运行良好。 AWTUtilities.setWindowOpacity(frame, (float) 0.7); - janetsmith
好的,但是如何在包含背景图像的JPanel上实现这一点(以便透过图像看到)? - Benj

1

在Windows 7上它的表现不是很好。

panel.setBackground( new Color(r, g, b, a) );

Alpha通道只是让颜色变亮。

当一个带有Alpha通道的颜色元素被更新时,计算机会感到困惑,并重置没有Alpha通道的更新元素的背景。我要尝试一下。

AWTUtilities.setWindowOpacity(aWindow, aFloat);

下一个。


1
如果您有一个自定义面板,并希望整个面板半透明,我建议您像这样覆盖其方法paintComponent:
@Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Graphics2D g2d = (Graphics2D) graphics;
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
    }

0
如何覆盖JPanel的paintComponent方法(为此,您必须对JPanel进行子类化并实现自己的paintComponent方法),在paintComponent中,您可以检索组件的缓冲图像,从那里可以操纵缓冲图像的alpha,并将其绘制回JPanel。我很久以前就读过这个。仍在寻找代码。

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