添加组件后,JFrame会丢失透明度特征

时间:2017-07-01 23:20:44

标签: java jframe transparent paintcomponent

我想制作一个覆盖窗口,其中包含一个透明框架,其中包含非透明子框架。我在制作透明窗口时取得了成功,甚至在添加测试子项时成功,看它是否有效。但是只要我用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);


        }

 }   
}

1 个答案:

答案 0 :(得分:2)

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,这只会降低你的组件不会随机出现的可能性