Непрозрачные компоненты на прозрачных окнах Java
Мне удалось сделать прозрачные окна 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);
}
}
РЕДАКТИРОВАТЬ: я пробовал setBackground (0,0,0,0) в Windows, где он работает, но он не работает должным образом в Linux (xfce).
1 ответ
Используя AWTUtilties.setOpaque(Window, boolean), вы можете получить то, что вы хотите. Вот пример полупрозрачной метки (с красным фоном):
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import com.sun.awt.AWTUtilities;
public class Test3 {
protected static void initUI() {
JFrame frame = new JFrame("test");
JLabel label = new JLabel("Label text");
label.setOpaque(true);
label.setBackground(new Color(255, 0, 0, 128));
frame.setUndecorated(true);
AWTUtilities.setWindowOpaque(frame, false);
frame.add(label);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initUI();
}
});
}
}
Вот несколько скриншотов с различными значениями альфа-канала (сделаны на белом фоне):
Альфа установлена в 128 (полупрозрачная):
Альфа установлена в 0 (полностью прозрачная):
Альфа установлена на 255 (полностью непрозрачная):