Java JFrame中JLayeredPane的透明度

Java JFrame中JLayeredPane的透明度,java,swing,applet,jframe,jlayeredpane,Java,Swing,Applet,Jframe,Jlayeredpane,我正在尝试向小程序添加一个覆盖,显示在JFrame中 小程序位于内容窗格上,而覆盖位于JFrame的JLayeredPane上 唯一没有显示的是,加载小程序并准备好播放后,将调用addApplet()方法 我试图禁用JLayeredPane中的所有绘图,但它仍然绘制可见的灰色背景。我不知道这种背景是从哪里来的 请注意,这两种颜色都是可见的,因此每个PaintComponent都必须是透明的 我如何摆脱灰色背景 public类RuneFrame扩展JFrame{ 专用JLabel装载标签; 私人

我正在尝试向小程序添加一个覆盖,显示在JFrame中

小程序位于内容窗格上,而覆盖位于JFrame的JLayeredPane上

唯一没有显示的是,加载小程序并准备好播放后,将调用addApplet()方法

我试图禁用JLayeredPane中的所有绘图,但它仍然绘制可见的灰色背景。我不知道这种背景是从哪里来的

请注意,这两种颜色都是可见的,因此每个PaintComponent都必须是透明的

我如何摆脱灰色背景

public类RuneFrame扩展JFrame{
专用JLabel装载标签;
私人油漆组件油漆层1;
私人油漆组件油漆层2;
公共运行名(){
超级(“符文”);
这个.setSize(781542);
此.setVisible(true);
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initUI();
}
私有void initUI(){
loadingLabel=新的JLabel(“加载…”);
加载标签。设置水平对齐(SwingConstants.中心);
添加(加载标签);
setLocationRelativeTo(空);
}
/**
*将小程序添加到框架中。加载小程序后执行此操作。
*@param小程序游戏显示在此框架中。
*/
公共无效添加小程序(小程序){
移除(装载标签);
paintLayer1=新的PaintComponent(Color.yellow,新颜色(0,0,0));
this.getLayeredPane().add(paintLayer1,新整数(1000));
paintLayer2=新的PaintComponent(新颜色(0,0,0,0),颜色为红色);
this.getLayeredPane().add(paintLayer2,新整数(1000));
this.getLayeredPane().set不透明(false);
this.getLayeredPane().setBackground(新颜色(0,0,0,0));
添加(applet);
包装();
}
}
public类PaintComponent扩展JComponent{
私色c1;
私人色彩;
公共油漆组件(颜色c1、颜色c2){
超级();
这1.c1=c1;
这1.c2=c2;
此.set不透明(false);
这个。设置大小(300300);
这个背景(新颜色(0,0,0,0));
}
@凌驾
公共空间涂料(图g){
//超级组件(g);
Graphics2D g2=(Graphics2D)g.create();
int w=200;
int h=200;
g2.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_超过0.5f);
g2.setPaint(新的梯度绘制(0,0,c1,0,h,c2));
g2.fillRect(0,0,w,h);
g2.dispose();
}
}

AWT组件(如
Applet
)不能透明/半透明。您的
PaintComponent
paint
方法应该调用
super.paint
,假设您希望它绘制它的孩子,我还想看看
JLayeredPane
是如何被
JFrame
小程序使用的。在后面。其思想是先绘制小程序,然后绘制顶部的
PaintComponent
。这也解释了为什么我不调用
super.paint
:我对渐变以外的任何东西都不感兴趣。编辑:我在发布之前阅读了
JRootPane
上的文档。上面写着“您可以选择将组件放在根窗格的分层窗格中”。好的,AWT组件也没有z顺序的概念,因此您可能会在这方面遇到问题,感谢您的帮助。:)我最终使用反射对
Applet
进行子类化,并使用Applet自己的
paint()
绘制覆盖。AWT组件(如
Applet
)无法透明/半透明。您的
PaintComponent
paint
方法应该调用
super.paint
,假设您希望它绘制它的孩子,我还想看看
JLayeredPane
是如何被
JFrame
小程序使用的。在后面。其思想是先绘制小程序,然后绘制顶部的
PaintComponent
。这也解释了为什么我不调用
super.paint
:我对渐变以外的任何东西都不感兴趣。编辑:我在发布之前阅读了
JRootPane
上的文档。上面写着“您可以选择将组件放在根窗格的分层窗格中”。好的,AWT组件也没有z顺序的概念,因此您可能会在这方面遇到问题,感谢您的帮助。:)最后,我使用反射将
小程序子类化,并使用小程序自己的
paint()
绘制覆盖图。