最近在写基于 Swing 的 GUI 程序,swing 默认的界面风格说不上丑,但也确实不怎么好看。这让我想起了 Swing 的观感(look and feel)。
使用观感我们可以动态的切换界面风格,此外还有很多第三方组织或个人开发的观感,可以让我们的 swing 程序更加炫酷。
为程序动态指定观感
默认的观感是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观感是这里面最好看的一个观感,而且它是矢量绘图的。
指定为系统观感
swing 是支持跨平台的,不同的系统都有自己默认的界面风格,可以为将swing 的观感指定为当前系统的界面风格,也就是系统观感,观感的设计之初就是为了让 swing 程序能动态的切换为当前系统的界面风格。
指定为当前观感为系统观感:
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
设置默认观感
在网络上有一种说法是,java安装目录下的jre/lib目录下有一个swing.properties
文件,通过修改文件中的swing.defaultlaf
属性可改变默认观感,例如:
swing.defaultlaf = javax.swing.plaf.nimbus.NimbusLookAndFeel
在JDK8上是没问题的,但是在较近版本的java中,JDK不再附带JRE,在JDK的lib文件夹下也无法找到这个文件。
于是网上又有一种说法是需要自己在在上述目录下新建一个swing.properties
文件,写下上面所说的属性,但这对于较新版本的JDK依旧无效。这种说法我也找到了出处,应该是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文件夹下新建了一个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,可以使用上面介绍的方法应用到程序中。