我想展示JLabel,但想要隐藏JFrame边框和其他低级容器,如JPanel。 只是JLabel显示在屏幕上。
我尝试了窗口透明度,但是如果尝试使用窗口不透明度,则遵循一段代码会隐藏所有内容。 在降低windowOpacity时,甚至JLabel也会变得模糊。我也试过JPanel,但无法获得准确的输出。 我只想在jdk1.6中使用此行为 我希望JLabel内容在没有任何不透明度影响的情况下正确显示,但背景必须纯粹是透明的。
public class TEST {
public static void main(String[] args) {
JFrame frame = new JFrame("Sanjaal Corps - Windows On Top Demo!");
frame.setSize(400, 100);
frame.setLocation(100, 150);
com.sun.awt.AWTUtilities.setWindowOpacity(frame,0.4f);
frame.setUndecorated(true);
frame.add(new JLabel("TESTING"));
frame.setAlwaysOnTop(true);
frame.setVisible(true);
}
}
我试着提供解决方案 http://www.dreamincode.net/forums/topic/140041-make-a-jpanel-transparent-to-see-the-desktop-behind/
但这里的问题是如果我们最小化或最大化窗口,然后设置一个恒定的颜色,那么发现它不是最好的解决方案或可能说完美的一个。
答案 0 :(得分:3)
假设您要显示标签的 foreground ,而不是其他任何文本/图标,您可以将框架的不透明度设置为false:
com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);
反对使用com.sun。**类的常见警告,遗憾的是它是在java7之前到达透明窗口的唯一方法
答案 1 :(得分:3)
假设我正确理解你的要求......
我通常会在Window
添加透明面板。这意味着,通常,Window
的透明度属性不会影响子组件,例如......
一般来说,现在有两种方法可以使窗口透明。
com.sun.AWTUtilities
类...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.Method;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class TransparentWindow02 {
public static void main(String[] args) {
new TransparentWindow02();
}
public TransparentWindow02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setUndecorated(true);
setOpaque(frame, false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setOpaque(false);
setLayout(new BorderLayout());
setBorder(new LineBorder(Color.RED));
JLabel label = new JLabel("Click me if you can see me");
label.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
SwingUtilities.windowForComponent(TestPane.this).dispose();
}
});
add(label);
}
}
public static void setOpaque(Window window, boolean opaque) {
String version = System.getProperty("java.runtime.version");
if (version.startsWith("1.7")) {
window.setBackground(new Color(0, 0, 0, 0));
} else {
try {
Class<?> awtUtilsClass = Class.forName("com.sun.awt.AWTUtilities");
if (awtUtilsClass != null) {
Method method = awtUtilsClass.getMethod("setWindowOpaque", Window.class, boolean.class);
method.invoke(null, window, opaque);
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
}
}