添加组件后 JFrame 失去透明特性

JFrame loses transparency trait once components added

我想制作一个叠加层 window,它有一个带有非透明子项的透明框架。我在制作透明 window 时成功了,甚至在添加测试子项以查看它是否有效时也成功了。但是,一旦我用我的 paintComponent 替换了该测试代码……我就得到了白色背景。有人知道为什么吗?

package blahh;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;;

public class LoadingFrame {

    public static void main(String[] args) {
        LoadingFrame Class = new LoadingFrame();
        Class.frameChar();


    }

    public void frameChar(){
        JFrame frame = new JFrame();
        B b = new B();


        frame.setUndecorated(true);
        frame.setBackground(new Color(0, 0, 0, 0));
        frame.setAlwaysOnTop(true);    
        frame.setPreferredSize(new Dimension(500, 500));
        frame.getContentPane().setLayout(new java.awt.BorderLayout()); 
        frame.setLocationRelativeTo(null);        
        frame.setVisible(true);
        //frame.getContentPane().add(new JLabel("test code");
        frame.add(b);
        frame.pack();
    }

 public class B extends JPanel{
     public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(0, 0, 100, 100);


        }

 }   
}

JPanel默认是不透明的,结合BorderLayout,这样会覆盖整个框架,显得不透明。你需要在上面调用setOpaque(false)才能让它看透

    JFrame frame = new JFrame();
    B b = new B();
    b.setOpaque(false);


    frame.setUndecorated(true);
    frame.setBackground(new Color(0, 0, 0, 0));
    frame.setAlwaysOnTop(true);    
    // I'd prefer to override getPreferredSize of B
    frame.setPreferredSize(new Dimension(500, 500));
    frame.setLocationRelativeTo(null);        
    frame.add(b);
    frame.pack();
    frame.setVisible(true);

ps- 你也应该尽可能最后调用 setVisible,它只是减少你的组件不随机出现的可能性