文章目录
- 问题一 加载自定义字体
- 问题二 设置全局字体
- 问题三 设置全局字体后,如何在不换字体的情况下更改字体参数
今天写代码的时候测试到一半的时候感觉界面的字体太难看,突发奇想想着改下字体,但把自己电脑翻到底也没招到什么好字体,所以去下载了个不是电脑自带的,为了防止代码移植的时候出现问题,所以又加上了个用字体文件设置的问题。
所以这次解决的的问题这么几点:
问题一 加载自定义字体
测试代码:
public class TestFrame extends JFrame {
public TestFrame() {
setBounds(0, 0, 400, 300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
File file = new File("fonts/方正楷体简体.TTF");
Font font = null;
try {
FileInputStream fi = new FileInputStream(file);
BufferedInputStream fb = new BufferedInputStream(fi);
font = Font.createFont(Font.TRUETYPE_FONT, fb);
font = font.deriveFont(Font.PLAIN, 25);
} catch (Exception e) { }
JLabel label1 = new JLabel("测试Label1");
JButton button1 = new JButton("测试button1");
JTextField field1 = new JTextField(10);
JTextArea area1 = new JTextArea(3, 20);
label1.setFont(font);
button1.setFont(font);
field1.setFont(font);
area1.setFont(font);
add(label1);
add(button1);
add(field1);
add(area1);
}
public static void main(String[] args) {
TestFrame frame = new TestFrame();
frame.validate();
}
}
代码参考来源
是否修改字体对比
问题二 设置全局字体
Main.java
public class Main {
public static void main(String[] args) {
try {
File file = new File("fonts/方正楷体简体.TTF");
Font font = null;
FileInputStream fi = new FileInputStream(file);
BufferedInputStream fb = new BufferedInputStream(fi);
font = Font.createFont(Font.TRUETYPE_FONT, fb);
font = font.deriveFont(Font.PLAIN, 25);
FontUIResource fontRes = new FontUIResource(font);
for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof FontUIResource) {
UIManager.put(key, fontRes);
}
}
} catch (Exception e) { }
new FirstFrame().validate();
}
}
FirstFrame.java
public class FirstFrame extends JFrame {
public FirstFrame() {
setTitle("第一个窗口");
setBounds(0, 0, 400, 300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JLabel label1 = new JLabel("测试Label1");
JButton button1 = new JButton("测试button1");
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SecondFrame();
}
});
JTextField field1 = new JTextField(10);
JTextArea area1 = new JTextArea(3, 20);
add(label1);
add(button1);
add(field1);
add(area1);
}
}
SecondFrame.java
public class SecondFrame extends JFrame {
public SecondFrame() {
setTitle("第二个窗口");
setBounds(0, 0, 400, 300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
JLabel label1 = new JLabel("测试Label1");
JButton button1 = new JButton("测试button1");
JTextField field1 = new JTextField(10);
JTextArea area1 = new JTextArea(3, 20);
add(label1);
add(button1);
add(field1);
add(area1);
}
}
全局字体设置来源
问题三 设置全局字体后,如何在不换字体的情况下更改字体参数
就像上面两个界面都是直接用了Main.java 设置的字体,那么问题就来了,如果我们仅仅只是想改变某个组件的字体大小呢?总不可能每次都去生成字体在调用吧,所以我找到了一些仅仅只改变原来字体一些参数的方法。
先来看下我们一般用的字体的构造方法吧
public Font(String name, int style, int size);
// name-->字体名 style-->字体样式:斜体粗体类 size-->字体大小
现在来获取当前界面字体
public Font getFont();
但是我们在界面中直接调用这个方法并没有任何效果,这个时候我发现了要先获取当前容器
// JFrame,JDialog 容器获取方法
public Container getContentPane()
// JPanel 容器获取方法 啊,不对,JPanel根本不需要获取容器
好了,当前字体工作已经准备完成了
改变字体的参数
// 改变字体大小
public Font deriveFont(float size);
// 改变字体样式
public Font deriveFont(int style);
// 改变字体名字……呃??名字有啥好改的。。。
来个例子吧
// 在JFrame中
Font font = getContentPane().getFont().deriveFont((float) 10.0);
// 呃。。。我也不知道为什么,反正里面一定要float形,int表示失败。。。
// style 我就不演示了,下面我改变了按钮和文本框的字体大小