Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅显示JLabel隐藏JFrame或任何较低级别的容器_Java_Swing_Jframe_Transparency_Jlabel - Fatal编程技术网

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

Java 如何仅显示JLabel隐藏JFrame或任何较低级别的容器,java,swing,jframe,transparency,jlabel,Java,Swing,Jframe,Transparency,Jlabel,我想显示JLabel,但想隐藏JFrame border和其他较低级别的容器,如JPanel。 它只是在屏幕上显示 我尝试了窗口透明度,但如果尝试使用窗口不透明度,下面的代码会隐藏所有内容。 降低windowOpacity时,即使是JLabel也会变得模糊。我也尝试使用JPanel,但无法获得准确的输出。 我只希望jdk1.6中有这种行为 我希望JLabel内容正确可见,没有任何不透明度影响,但Backburnd必须完全透明 public class TEST { publi

我想显示JLabel,但想隐藏JFrame border和其他较低级别的容器,如JPanel。 它只是在屏幕上显示

我尝试了窗口透明度,但如果尝试使用窗口不透明度,下面的代码会隐藏所有内容。 降低windowOpacity时,即使是JLabel也会变得模糊。我也尝试使用JPanel,但无法获得准确的输出。 我只希望jdk1.6中有这种行为 我希望JLabel内容正确可见,没有任何不透明度影响,但Backburnd必须完全透明

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

    }

}
我尝试了提供的解决方案


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

假设您希望显示标签(没有其他内容)的前景,即其文本/图标,您会将框架的不透明度设置为false:

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

使用com.sun.**类的常见警告,不幸的是,如果我正确理解您的需求,这是访问java7之前的透明窗口的唯一方法

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

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

  • 在Java7下,只需将其背景色设置为透明即可
  • 在Java6(update 10+)下,您需要使用非官方的
    com.sun.awutilities
  • 导入java.awt.BorderLayout;
    导入java.awt.Color;
    导入java.awt.EventQueue;
    导入java.awt.Window;
    导入java.awt.event.MouseAdapter;
    导入java.awt.event.MouseEvent;
    导入java.lang.reflect.Method;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.SwingUtilities;
    导入javax.swing.UIManager;
    导入javax.swing.UnsupportedLookAndFeelException;
    导入javax.swing.border.LineBorder;
    公开课透明课02{
    公共静态void main(字符串[]args){
    新的透明材料TWINDOW02();
    }
    公开透明{
    invokeLater(新的Runnable(){
    @凌驾
    公开募捐{
    试一试{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
    }
    JFrame=新JFrame(“测试”);
    框架。设置未装饰(真实);
    set不透明(框,假);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(newtestpane());
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    });
    }
    公共类TestPane扩展了JPanel{
    公共测试窗格(){
    设置不透明(假);
    setLayout(新的BorderLayout());
    设置顺序(新的线边框(颜色为红色));
    JLabel label=新的JLabel(“如果可以看到我,请单击我”);
    label.addMouseListener(新的MouseAdapter(){
    @凌驾
    公共无效mouseClicked(MouseEvent e){
    SwingUtilities.windowForComponent(TestPane.this.dispose();
    }
    });
    添加(标签);
    }
    }
    公共静态void setOpaque(窗口,布尔不透明){
    String version=System.getProperty(“java.runtime.version”);
    if(版本.startsWith(“1.7”)){
    窗口背景(新颜色(0,0,0,0));
    }否则{
    试一试{
    Class awtUtilsClass=Class.forName(“com.sun.awt.AWTUtilities”);
    如果(awtUtilsClass!=null){
    方法Method=awtUtilsClass.getMethod(“setWindow不透明”,Window.class,boolean.class);
    调用(null、window、不透明);
    }
    }捕获(异常扩展){
    exp.printStackTrace();
    }
    }
    }
    }
    
    为了更快地获得更好的帮助,发布一篇文章。我在main中添加了所有内容,因此现在粘贴了整个类
    com.sun.awt.AWTUtilities
    ,它非常脆弱。你说。。“我只希望jdk1.6中有这种行为”,但这在非Oracle JRE中不起作用。顺便说一句,为什么是JDK而不是JRE?你的用户有JDK?很抱歉,这个词选错了,我的意思是只使用jre,是的,我同意jre1.6的rt.jar限制了访问,但我只是想看看它的行为,并想解释一下我到底想要什么。我也尝试过AlphaComposite,但无法满足确切的要求为什么你要浪费我的时间<代码>线程“main”java.awt.IllegalComponentStateException中的异常:框架被修饰
    该代码是垃圾代码,而不是您一直运行的任何代码。我重复一遍,为了更快地得到更好的帮助,请发布一条消息。SSCCE应该包括导入,并在此处显示与在此处相同的行为。另外,为了透明,请忽略那些(该死的)
    com.sun
    类,并查看公共API,如或中所示。。
    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();
                }
            }
        }
    }