杰瑞科技汇

Java Swing字体设置方法有哪些?

setFont()

在 Swing 中,几乎所有继承自 JComponent 的组件(如 JLabel, JButton, JTextField, JTextArea 等)都使用同一个核心方法来设置字体:

Java Swing字体设置方法有哪些?-图1
(图片来源网络,侵删)
component.setFont(Font font);

这个方法需要一个 java.awt.Font 类型的对象作为参数,设置字体的关键在于如何创建这个 Font 对象。


创建 Font 对象

Font 类的构造函数有三个主要参数:

public Font(String name, int style, int size)
  • name (字体名称): 字体的逻辑名称,你可以使用系统预装的字体,

    • "SansSerif" (无衬线字体,通常对应系统默认的无衬线字体)
    • "Serif" (衬线字体,通常对应系统默认的衬线字体,如 Times New Roman)
    • "Monospaced" (等宽字体,每个字符宽度相同,如 Courier New)
    • 也可以直接使用系统字体名称,如 "Microsoft YaHei", "SimSun", "Arial" 等。注意:如果指定的字体在系统中不存在,Swing 会使用默认字体作为回退。
  • style (字体样式): 这是一个整数,可以使用 Font 类的静态常量来组合:

    Java Swing字体设置方法有哪些?-图2
    (图片来源网络,侵删)
    • Font.PLAIN (普通样式, 值为 0)
    • Font.BOLD (粗体, 值为 1)
    • Font.ITALIC (斜体, 值为 2)
    • 组合样式: 使用位运算符 来组合,Font.BOLD | Font.ITALIC 同时表示粗体和斜体。
  • size (字体大小): 一个整数,表示字体的大小(单位是磅,Point)。


基本使用示例

下面是一个简单的例子,展示如何为不同组件设置不同的字体。

import javax.swing.*;
import java.awt.*;
public class FontExample {
    public static void main(String[] args) {
        // 1. 创建主窗口
        JFrame frame = new JFrame("Swing 字体设置示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 400);
        frame.setLayout(new FlowLayout()); // 使用流式布局
        // 2. 创建一个标签
        JLabel label = new JLabel("这是一个普通标签");
        // 设置标签字体:SansSerif, 普通, 18号
        label.setFont(new Font("SansSerif", Font.PLAIN, 18));
        frame.add(label);
        // 3. 创建一个按钮
        JButton button = new JButton("粗体按钮");
        // 设置按钮字体:Serif, 粗体, 20号
        button.setFont(new Font("Serif", Font.BOLD, 20));
        frame.add(button);
        // 4. 创建一个文本输入框
        JTextField textField = new JTextField("输入一些文字");
        // 设置文本框字体:Monospaced, 斜体, 16号
        textField.setFont(new Font("Monospaced", Font.ITALIC, 16));
        frame.add(textField);
        // 5. 创建一个文本区域
        JTextArea textArea = new JTextArea("这是一个文本区域,\n可以多行显示。");
        textArea.setLineWrap(true); // 自动换行
        textArea.setWrapStyleWord(true); // 按单词换行
        // 设置文本区域字体:使用系统自带的 "微软雅黑",粗体+斜体,14号
        textArea.setFont(new Font("Microsoft YaHei", Font.BOLD | Font.ITALIC, 14));
        // 为了让文本区域能够滚动,把它放进一个 JScrollPane 中
        JScrollPane scrollPane = new JScrollPane(textArea);
        frame.add(scrollPane);
        // 6. 显示窗口
        frame.setVisible(true);
    }
}

运行效果


高级技巧

1 获取现有字体并修改

你可能想基于组件当前的字体进行修改,而不是完全重新创建一个 Font 对象,这可以通过 getFont() 方法实现。

场景:将按钮的字体在原有基础上增加大小,并设置为粗体。

// 假设我们有一个 button 对象
JButton button = new JButton("点击我");
Font originalFont = button.getFont(); // 获取当前字体
// 修改字体样式为粗体,大小增加4
Font newFont = new Font(originalFont.getName(), Font.BOLD, originalFont.getSize() + 4);
button.setFont(newFont);

2 为整个窗口或面板统一设置字体

如果你希望一个容器(如 JFrame, JPanel)中的所有组件都使用同一种字体,可以设置该容器的字体,Swing 会自动将这个字体传递给其所有子组件(前提是子组件没有自己单独设置字体)。

// 创建一个面板
JPanel panel = new JPanel();
// 为整个面板设置字体
panel.setFont(new Font("Dialog", Font.PLAIN, 16));
// 往面板里添加组件,它们会默认继承面板的字体
panel.add(new JLabel("继承自面板的字体"));
panel.add(new JTextField("我也是"));
// 将面板添加到窗口
frame.add(panel);

注意:这种方法只对后续添加的且没有自己设置字体的组件有效,一旦某个组件调用了 setFont(),它就会使用自己的字体,不再继承父容器的字体。

3 获取系统可用字体列表

如果你想在程序中动态选择字体,可以获取系统所有可用的字体名称。

// 获取所有可用字体的名称
String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontNames();
// 可以在一个下拉框中显示这些字体
JComboBox<String> fontComboBox = new JComboBox<>(fontNames);
// 为下拉框添加选择事件监听器
fontComboBox.addActionListener(e -> {
    String selectedFontName = (String) fontComboBox.getSelectedItem();
    // 假设我们要修改 label 的字体
    label.setFont(new Font(selectedFontName, label.getFont().getStyle(), label.getFont().getSize()));
});
frame.add(fontComboBox);

4 使用 UIManager 设置全局默认字体

这是最强大的方法,可以修改整个 Swing 应用程序所有组件的默认字体,而无需为每个组件单独设置。

重要提示:这个设置必须在创建任何 Swing 组件之前进行!否则可能不会生效。

import javax.swing.*;
import java.awt.*;
public class GlobalFontExample {
    public static void main(String[] args) {
        // 在创建任何组件之前设置全局字体
        Font defaultFont = new Font("Microsoft YaHei", Font.PLAIN, 14);
        UIManager.put("OptionPane.messageFont", defaultFont);
        UIManager.put("Button.font", defaultFont);
        UIManager.put("Label.font", defaultFont);
        UIManager.put("TextField.font", defaultFont);
        // ... 可以设置更多组件的默认字体
        // 使用 SwingUtilities.invokeLater 确保事件分发线程安全
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("全局字体设置示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
            frame.add(new JLabel("这是一个标签"));
            frame.add(new JButton("这是一个按钮"));
            frame.add(new JTextField("这是一个文本框"));
            frame.pack(); // 自动调整窗口大小以适应组件
            frame.setVisible(true);
        });
    }
}

通过 UIManager,你可以精确控制不同类型组件的默认外观,包括字体、颜色等。


方法 用途 优点 缺点
component.setFont(new Font(...)) 为单个组件设置字体 精确控制,灵活 需要为每个组件单独设置
parent.setFont(...) 为容器及其未设置字体的子组件设置字体 批量设置,方便 子组件可覆盖,必须在添加子组件前设置
UIManager.put(...) 设置整个应用程序的全局默认字体 一劳永逸,统一风格 必须在任何 Swing 组件创建之前调用

对于简单的程序,直接使用 setFont() 是最直接的方式,对于需要统一风格的复杂应用程序,推荐使用 UIManager 在程序启动时设置全局字体。

分享:
扫描分享到社交APP
上一篇
下一篇