今天用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 介面如何?