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

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类的静态常量来组合:
(图片来源网络,侵删)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 在程序启动时设置全局字体。
