我已经成功地使 java 窗口透明,但是在这些窗口上叠加不透明组件时遇到了麻烦。JFrame.setOpacity(0) 和 AWTUtilities setWindowOpacity 都将透明度传递给组成组件。此外, JFrame.setBackground(0,0,0,0) 以某种方式使所述组件失去透明度。
我怎样才能解决这个问题?
测试类:分别为透明背景、setOpacity 和 AWTUtility
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Color;
public class test {
public static void main(String[] args){
JFrame frame = new JFrame("test");
JLabel label = new JLabel("Label text");
frame.setUndecorated(true);
frame.setBackground(new Color(0,0,0,128));
frame.add(label);
frame.pack();
frame.setVisible(true);
}
}
public class test2 {
public static void main(String[] args){
JFrame frame = new JFrame("test");
JLabel label = new JLabel("Label text");
frame.setUndecorated(true);
frame.setOpacity(.50f);
frame.add(label);
frame.pack();
frame.setVisible(true);
}
}
import com.sun.awt.AWTUtilities;
import java.lang.reflect.Method;
import java.awt.Window;
public class test3 {
public static void main(String[] args){
JFrame frame = new JFrame("test");
JLabel label = new JLabel("Label text");
frame.setUndecorated(true);
try {
Class<?> awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities");
Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class);
mSetWindowOpacity.invoke(null, frame, Float.valueOf(0.50f));
} catch (Exception x){}
frame.add(label);
frame.pack();
frame.setVisible(true);
}
}
编辑:我在 Windows 上尝试过 setBackground(0,0,0,0) ,它可以工作,但在 Linux (xfce) 上不能正常工作。