欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java杂谈之--Swing观感(look & feel)

程序员文章站 2022-03-12 17:09:40
...

最近肺炎病毒肆虐,在家闲来无事,决定用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上有一种可以很方便查看各种观感以及其展示效果的方法:在新建里面选择:java杂谈之--Swing观感(look & feel)然后在里面拖入几个控件,鼠标右击空白处选择第一项preview,过一会就会出现一个Form Perview窗口,在这里面你可以预览任何已安装的观感:
java杂谈之--Swing观感(look & feel)个人觉得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,可以使用上面介绍的方法应用到程序中。