如何仅显示隐藏JFrame或任何较低级别容器的JLabel

时间:2013-09-01 10:42:09

标签: java swing jframe transparency jlabel

我想展示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/

但这里的问题是如果我们最小化或最大化窗口,然后设置一个恒定的颜色,那么发现它不是最好的解决方案或可能说完美的一个。

2 个答案:

答案 0 :(得分:3)

假设您要显示标签的 foreground ,而不是其他任何文本/图标,您可以将框架的不透明度设置为false:

com.sun.awt.AWTUtilities.setWindowOpaque(frame, false);

反对使用com.sun。**类的常见警告,遗憾的是它是在java7之前到达透明窗口的唯一方法

答案 1 :(得分:3)

假设我正确理解你的要求......

我通常会在Window添加透明面板。这意味着,通常,Window的透明度属性不会影响子组件,例如......

enter image description here

一般来说,现在有两种方法可以使窗口透明。

  1. 在Java 7下,您只需使其背景颜色透明即可。
  2. 在Java 6(更新10+)下,您需要使用非官方com.sun.AWTUtilities
  3. ...

    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();
                }
            }
        }
    }