今天用swing 做了一个模仿qq2009的登录界面,用到了开源的look&feel (substance),在使用的过程中遇到了一些问题,也学到了一些技巧。
substance (https://substance.dev.java.net)有很多的外观可以选择,而且都很漂亮,还提供了强大的api供开发者使用。substance 现在已经
发展到5.2rc 版了,一开始我使用的是5.1版,但是在使用的过程中发现了一些bug,当我使用substance中提供的水印功能时,出现了许多的异常,这个bug在5.0的时候是没有的,后来我又下载了最新的5.2rc版,这个问题在5.2版中已经解决了。大家如果需要的话,可以点 。
第一个问题:如何完整的使用look&feel?
大家可能会问了,什么叫着完整的使用look&feel?这里先不急着说明,先让大家看一副截图;
大家看看上面幅图是否已经用了look&feel? 答案是正确的,但是并不完整,因为他的标题栏还没有改变,完整的使用look&feel后的截图如下:
是不是觉得很不一样了呢?对于swing 的老手来说,这个是小菜一碟,但是对于新手来说就比较困难了,因为他们看到的使用look&feel的许多教程都是像
这样的:
uimanager.setlookandfeel(new substanceofficeblue2007lookandfeel());
或者这样:
try {
uimanager.setlookandfeel("org.jvnet.substance.skin.substanceravengraphitelookandfeel");
} catch (exception e) {
system.out.println("substance raven graphite failed to initialize");
}
或者说是我自己太菜了吧。总之我在认真学习swing的外观使用之前我是不知道该如何使标题栏也改变的。
要改变标题栏其实只要一句话就够了,就是在main方法中添加这么一句:
jframe.setdefaultlookandfeeldecorated(true);
如果想要让jdialog也改变的话,还要再加上:
jdilog.setdefaultlookandfeeldecorated(true);
下面是最终完成的界面,使用的是
substance中 officeblue2007lookandfeel:
第二个问题,如何给应用程序添加水印或者说是背景?
官方的文档说的很少,也没有具体的使用例子说明,后来下载了substance的源码来看才发现该如何使用。
以下就是我参考官方源码写的在main方法中的一段核心代码
jframe.setdefaultlookandfeeldecorated(true);
jdialog.setdefaultlookandfeeldecorated(true);
try {
substanceimagewatermark watermark = new substanceimagewatermark(loginframe.class.getresourceasstream("/demo/001.jpg"));
watermark.setkind(imagewatermarkkind.screen_center_scale);
substanceskin skin = new officeblue2007skin().withwatermark(watermark); //初始化有水印的皮肤
uimanager.setlookandfeel(new substanceofficeblue2007lookandfeel());
substancelookandfeel.setskin(skin); //设置皮肤
} catch (unsupportedlookandfeelexception ex) {
logger.getlogger(loginframe.class.getname()).log(level.severe, null, ex);
}
上面的代码中有一句代码的位置是不能变的,那就是
substancelookandfeel.setskin(skin); 。
它必须要在
uimanager.setlookandfeel(new substanceofficeblue2007lookandfeel()); 这句的下面。
否则你看不到水印的效果。下图是有水印和没水印的对比图(左边的是有水印的,右边的是没水印的):
再贴一张官方的一张截图:大家看看swing写的 office2007 界面如何?