Java - 在 JPanel 中设置不透明度

2022-09-02 09:00:18

假设我想使 JPanel %20 的不透明度可见?我不是说setOpaque(绘制或不绘制)或setVisible(显示或隐藏)...我的意思是让它透明化JPanel。你知道的?

这可能吗?


答案 1

您需要为 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);

查看“透明背景”,了解有关实际绘画问题以及上述代码解决问题的原因的更多信息。该链接还包含一个自定义可重用类,用于为您执行上述绘制。


答案 2

使用 alpha 属性作为颜色。

例如:

panel.setBackground(new Color(0,0,0,64));

将创建一个黑色,与 64 的 alpha ( 透明度 )

结果是:

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


推荐