Java窗体透明化(无边框)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/x1020915098/article/details/56843289

Java 窗体透明化(无边框)

这几天我在写一个记事本程序,为了方便记事本记事,我准备将记事本界面透明化。于是上网查了一下资料。然后将透明化界面做了出来。

可是在做的过程中我还是遇到了一些小小的问题,所以就把它记录了下来。

问题1:奇怪的错误(访问限制:Access restriction)

透明化窗体中有这样一段代码:

// 判断系统是否支持窗体透明化
if (com.sun.awt.AWTUtilities.isWindowOpaque(this)) {
    // 设置窗体透明化, 透明参数值[0, 1](float类型)
    com.sun.awt.AWTUtilities.setWindowOpacty(this, 0.5f);
} else {
    JOptionPane.showMessageDialog(this, "系统不支持 JDK版本过低或JRE系统库缺损");
]

这段代码明明是没有错的,但是Eclipse却偏偏报了错,这是为什么呢?
通过错误提示,点击 “Configure problem severity” ,我发现了问题所在,原来是eclipse的配置问题。

解决方法如下:

菜单栏找到 Window -> Preferences -> Java Compiler(中间可能省略几步,你可以搜索) -> Errors/Warnings -> Deprecated and restricted API -> Forbidden reference(access rules) 后面的 Error 下拉改成 Warning 或者 Ignore -> 确定。
然后就 OK 了!

问题二:郁闷的异常(IllegalComponentStateException)

当我所有的代码都写完之后,一运行,结果出现了编译异常。当时我想把它抛出去,但是我又是遇到问题不能放的人。所以就找了一下原因。

Exception in thread "main" java.awt.IllegalComponentStateException: The frame is decorated
at java.awt.Frame.setOpacity(Unknown Source)
at java.awt.Window$1.setOpacity(Unknown Source)
at com.sun.awt.AWTUtilities.setWindowOpacity(Unknown Source)
at Opacity.<init>(Opacity.java:18)
at Opacity.main(Opacity.java:7)

最后我终于发现了错误的原因,原来是由于我写的窗体是可显示的所以抛出了这样一个异常。

之后我在我的源代码之上加了这么一句就好了。

this.setUndecorated(true);  // 禁用窗体装饰,加在前面就好了

关于这个函数我在 《JDK API 1.6.0中文版》查了一下,上面是这样说的。

/*setUndecorated
public void setUndecorated(boolean undecorated)禁用或启用此窗体的装饰。只有在窗体不可显示时才调用此方法。 

参数:
undecorated - 如果没有启用窗体装饰,则为 true;如果启用了窗体装饰,则为 false。 
抛出: 
IllegalComponentStateException - 如果窗体是可显示的。
从以下版本开始: 
1.4 
另请参见:
isUndecorated(), Component.isDisplayable(), JFrame.setDefaultLookAndFeelDecorated(boolean)*/

测试源码:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Opacity extends JFrame {
    public static void main(String[] args) {
        new Opacity();
    }
    Opacity() {
        this.setTitle("窗体透明化测试");

        JButton btn = new JButton();
        this.add(btn);
        double value = 0.4;
        // 判断是否支持透明度
        this.setUndecorated(true); // 禁用或启用此窗体的修饰。只有在窗体不可显示时
                                   //才调用此方法。
        if (com.sun.awt.AWTUtilities.isWindowOpaque(this)) {
            com.sun.awt.AWTUtilities.setWindowOpacity(this, (float)(1 - value));
        } else {
            JOptionPane.showMessageDialog(this, "系统不支持 JDK版本过低或 JRE 系统库缺损");
        }

        this.setBounds(400,400,400,300);
        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

转载请注明出处!

此逗比的QQ:1020915098

希望认识一些同我一样热爱技术的人士(要是能认识一些大神就更好了! 嘤嘤~)。

展开阅读全文

没有更多推荐了,返回首页