用开源Look&Feel (Substance)写 漂亮的Swing应用程序
今天用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("org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel");
} catch (Exception e) {
System.out.println("Substance Raven Graphite failed to initialize");
}
或者说是我自己太菜了吧。总之我在认真学习Swing的外观使用之前我是不知道该如何使标题栏也改变的。
要改变标题栏其实只要一句话就够了,就是在main方法中添加这么一句:
如果想要让JDialog也改变的话,还要再加上: JDilog.setDefaultLookAndFeelDecorated(true);
下面是最终完成的界面,使用的是Substance中 OfficeBlue2007LookAndFeel:
第二个问题,如何给应用程序添加水印或者说是背景?
官方的文档说的很少,也没有具体的使用例子说明,后来下载了Substance的源码来看才发现该如何使用。
以下就是我参考官方源码写的在main方法中的一段核心代码
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 界面如何?
转:http://www.blogjava.net/gml520/archive/2009/05/23/277603.html
用开源Look&Feel (Substance)写 漂亮的Swing应用程序的更多相关文章
- Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...
- 用Racket语言写了一个万花筒的程序
用Racket语言写了一个万花筒的程序 来源:https://blog.csdn.net/chinazhangyong/article/details/79362394 https://github. ...
- Python3的tkinter写一个简单的小程序
一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- Python写一个自动点餐程序
Python写一个自动点餐程序 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有 ...
- 【译】写个好的 CLI 程序
写个好的 CLI 程序 Write a Good CLI Program 译文 原文链接:https://qiita.com/tigercosmos/items/678f39b1209e60843cc ...
- 原创《开源一个用 vue 写的树层级组件 vue-ztree》
最近由于后台管理项目的需要,页面需要制作一个无限树的需求,我第一感就想到了插件 ztree,不过我觉得它太大了,还是自己动手丰衣足食吧. ztree 的 demo 地址:http://www.tree ...
- [开源]如何使用goapp写你的后台管理系统_golang
简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...
随机推荐
- TDD(测试驱动开发)培训录(转)
本文转载自:http://www.cnblogs.com/whitewolf/p/4205761.html 最近也在了解TDD,发现这篇文章不错,特此转载一下. TDD(测试驱动开发)培训录 2015 ...
- Android -- Properties使用
import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public ...
- Java系列:JVM指令详解(上)(zz)
一.未归类系列A 此系列暂未归类. 指令码 助记符 说明 59:iastore 60:lload 6 //因为str ...
- [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点
4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...
- [CareerCup] 13.4 Depp Copy and Shallow Copy 深拷贝和浅拷贝
13.4 What is the difference between deep copy and shallow copy? Explain how you would use each. 这道题问 ...
- 20145222黄亚奇《Java程序设计》第3周学习总结
学号 <Java程序设计>第X周学习总结 教材学习内容总结 第四章: 类是对象的设计图,对象是类的实例. 参考名称与对象数据成员同名时,可以在数据成员前使用this区别. =是用在指定参考 ...
- css优化篇
平时总说如何如何优化,今天就详细的写一下css如何优化,嘿嘿. 首先,CSS的优化工作主要从两个方面着手 网络性能:把CSS写到字节数最少,加快下载速度,自然可以让页面渲染的更快一些 语法性能:同样都 ...
- 你会swap吗,按值传递还是按引用?
问题 1.Java到底是按值传递(Call by Value),还是按引用传递(Call by Reference)? 2.如下面的代码,为什么不能进行交换? public CallBy swap2( ...
- EntityFramework系列:Repository模式与单元测试
1.依赖IRepository接口而不是直接使用EntityFramework 使用IRepository不只是架构上解耦的需要,更重要的意义在于Service的单元测试,Repository模式本身 ...
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系(转载)
ASCII.Unicode.GBK和UTF-8字符编码的区别联系 转载自:http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...