观感LookAndFeel(通常简写LAF)简而言之就是控件主题,我们可以使用内置的几种控件主题,也可以套用第三方主题。JDK自带了一些观感,所有Swing程序默认使用Metal
观感,在不同平台上自带的观感不同,我们可以用程序输出所有已经安装的观感。
UIManager.LookAndFeelInfo[] lookAndFeels = UIManager.getInstalledLookAndFeels();
for(UIManager.LookAndFeelInfo l : lookAndFeels) {
System.out.println(l.getName() + ":" + l.getClassName());
}
UIManager
是Swing提供的一个工具类,可以用它获取已安装的观感。
Ubuntu系统中运行结果如下。
Metal:javax.swing.plaf.metal.MetalLookAndFeel
Nimbus:javax.swing.plaf.nimbus.NimbusLookAndFeel
CDE/Motif:com.sun.java.swing.plaf.motif.MotifLookAndFeel
GTK+:com.sun.java.swing.plaf.gtk.GTKLookAndFeel
WindowsXP中运行结果如下。
Metal:javax.swing.plaf.metal.MetalLookAndFeel
Nimbus:com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
CDE/Motif:com.sun.java.swing.plaf.motif.MotifLookAndFeel
Windows:com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Windows Classic:com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel
使用UIManager
工具类可以设置观感,下面是一个例子。
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
Metal是Swing默认的经典观感,设计较为朴素,它也是Sun公司最早为Swing开发的观感。
javax.swing.plaf.metal.MetalLookAndFeel
Nimbus是Sun公司发布JavaSE6时新增的观感,采用了时下最流行的拟物风格水晶面板,设计精良,效果非常华丽。
com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
Motif是Sun公司开发的Unix系操作系统Solaris的界面库,Solaris使用一种叫做CDE的桌面环境,面向“专业”用户。虽然这是一种几十年前的UI风格,但不可否认其精良的设计性,个人非常喜欢这个主题。
com.sun.java.swing.plaf.motif.MotifLookAndFeel
Windows观感看上去和Win32类似,不过细节又略有不同,总体似乎有点纠结。
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
如果Swing界面字体锯齿问题比较严重,很影响视觉效果,可能是当前版本JDK的字体抗锯齿没有打开,我们可以手动配置。
System.setProperty("awt.useSystemAAFontSettings", "on");
System.setProperty("swing.aatext", "true");
其次,我们也可以调节UI字体。下面例子代码编写了一个能够设置字体的函数:
public static void setUIFont(FontUIResource f) {
Enumeration<Object> keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value != null && value instanceof FontUIResource) {
UIManager.put(key, f);
}
}
}
调用setUIFont()
时需要传入一个FontUIResource
对象:
setUIFont (new FontUIResource("微软雅黑",Font.BOLD,15));
注意,存储字体的是一个Map
,我们向其中添加字体资源FontUIResource
即可,如果未找到我们指定的字体资源,就会使用默认的。
有关设置观感、字体和抗锯齿,我这里封装了一个工具类:
package com.gacfox.demo;
import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.util.Enumeration;
/**
* 注意:在窗口初始化前调用
*/
public class GoodLookUtil {
public static void antiAliasing() {
System.setProperty("awt.useSystemAAFontSettings", "on");
System.setProperty("swing.aatext", "true");
}
public static void setNimbus() {
try {
UIManager
.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("set look and feel error");
}
}
public static void setCDE() {
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("set look and feel error");
}
}
public static void setGTKPlus() {
try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("set look and feel error");
}
}
// 调用示例:GoodLookUtil.setUIFont(new FontUIResource("微软雅黑",Font.PLAIN,15));
public static void setUIFont(FontUIResource f) {
Enumeration<Object> keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value != null && value instanceof FontUIResource) {
UIManager.put(key, f);
}
}
}
}