LookAndFeel观感

观感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

Metal是Swing默认的经典观感,设计较为朴素,它也是Sun公司最早为Swing开发的观感。

javax.swing.plaf.metal.MetalLookAndFeel

Nimbus

Nimbus是Sun公司发布JavaSE6时新增的观感,采用了时下最流行的拟物风格水晶面板,设计精良,效果非常华丽。

com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel

Motif

Motif是Sun公司开发的Unix系操作系统Solaris的界面库,Solaris使用一种叫做CDE的桌面环境,面向“专业”用户。虽然这是一种几十年前的UI风格,但不可否认其精良的设计性,个人非常喜欢这个主题。

com.sun.java.swing.plaf.motif.MotifLookAndFeel

Windows

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);
            }
        }
    }
}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap