Java - 在 JPanel 中设置不透明度

新手上路,请多包涵

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

这可能吗?

原文由 test 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 857
2 个回答

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

查看 Backgrounds With Transparency 以获取有关实际绘画问题的更多信息以及上述代码解决问题的原因。该链接还包含一个自定义的可重用类,可以为您完成上述绘制。

原文由 camickr 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用颜色的 alpha 属性。

例如:

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

将创建一个黑色,具有 64 个 alpha(透明度)

结果是:

样本

这是代码

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 );

替代文字

原文由 OscarRyz 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题