java杂谈之--Swing观感(look & feel)
最近肺炎病毒肆虐,在家闲来无事,决定用java写个小程序,用Swing写了个简单的GUI,结果写完发现界面实在丑的看不下去。这让我想起了Swing的观感(look and feel)。
为程序动态指定观感
默认的观感是Metal,比起现在所看到的那些精美的界面,Metal观感确实很丑。
可以为应用程序动态的指定观感:
try {
//指定观感,参数为观感类名
UIManager.setLookAndFeel ("javax.swing.plaf.nimbus.NimbusLookAndFeel");
//刷新组件树,显示新指定的观感
SwingUtilities.updateComponentTreeUI (frame);
} catch (ClassNotFoundException | InstantiationException |
IllegalAccessException | UnsupportedLookAndFeelException e) {
e.printStackTrace ();
}
需要注意的是指定观感后必须动态的刷新组件树,否则组件显示的还是默认观感。
可以通过以下方法列举已经安装的所有观感:
UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels ();
for (int i = 0; i < infos.length; i++) {
System.out.println (infos[i]);
}
例如,在我的电脑上就有以下几种观感:
javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[Nimbus javax.swing.plaf.nimbus.NimbusLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[Windows Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel]
在IDEA IDE上有一种可以很方便查看各种观感以及其展示效果的方法:在新建里面选择:然后在里面拖入几个控件,鼠标右击空白处选择第一项preview,过一会就会出现一个Form Perview窗口,在这里面你可以预览任何已安装的观感:
个人觉得Nimbus观感是这里面最好看的一个观感,而且它是矢量绘图的。
指定为系统观感
跨平台是java的一个非常重要的特性,设计观感的初衷就是为了swing的跨平台,让程序员能够开发出与相应平台风格一致的程序。有一种简便的方法指定程序观感为本地风格:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
设置默认观感
在网络上有一种说法是,java安装目录下的jre/lib目录下有一个swing.properties文件,通过修改文件中的swing.defaultlaf属性可改变默认观感,例如:
swing.defaultlaf = javax.swing.plaf.nimbus.NimbusLookAndFeel
但是在最近版本的java中,根本没有jre这个文件夹,在lib文件夹下也无法找到这个文件。网上的这种说法个人推测可能是源自《java核心技术卷一》一书中11.1.3节的记载。但是这本书是基于JDK 8.0写的,最新的已经更新到了JDK 13。
于是网上又有一种说法是需要自己在在上述目录下新建一个swing.properties文件,写下上面所说的属性。这种说法我也找到了出处,应该是Oracle官网上的《java™教程》,原话大意说是在bin目录下修改swing.properties文件(可能需要自己创建)的swing.defaultlaf属性,就可以改变默认观感。但这本书也是基于JDK 8写的,所以这种方法对于最近版本的JDK也不适用。此外,这个教程还说了一种通过命令行来修改的方法,经测试,也不能用。
所以要找解决办法还得从最近版本的JDK文档入手,不可人云亦云。在JDK 13的文档中,UIManager类下面的一句话提醒了我: Typically the swing.properties file is located in the conf subdirectory of the Java installation directory. conf本来就是放配置文件的地方,设置默认观感的文件肯定应该放在这里啊。于是立马在conf文件夹下新建了一个swing.properties文件,写上了如下内容:
# Swing propreties
#swing.defaultlaf = javax.swing.plaf.metal.MetalLookAndFeel
swing.defaultlaf = javax.swing.plaf.nimbus.NimbusLookAndFeel
#swing.defaultlaf = com.sun.java.swing.plaf.motif.MotifLookAndFeel
#swing.defaultlaf = com.sun.java.swing.plaf.windows.WindowsLookAndFeel
#swing.defaultlaf = com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
想用哪个作为默认观感就去掉前面的#取消注释,在其他的前面加上#注释掉,运行一下程序,大功告成。
其他
也有一些第三方开发的观感,例如Napkin,可以使用上面介绍的方法应用到程序中。