Table of Contents

一、问题描述

二、找资料

1、Swing技巧. 设置全局字体(sun jdk)

2、java swing 界面统一设置字体样式

三、尝试解决

1、使用默认的字体(即不修改字体,方便对比):

2、在main()方法中,定义窗口JFrame前调用:

3、在init()方法中,初始化窗口JFrame(未加载控件)时(即方法首行)调用:

4、反例,即该方法的调用位置不对,没有效果的情况:

4.1 在init()加载部分组件后调用:

4.2 在init()全部加载组件后调用(如最后一行):

4.3 在main()的init()方面后面调用:

5、 总结:

四、进一步理解:

五、拓展延伸——在全局字体的基础上加一些特殊点的字体


一、问题描述

最近写一个java的GUI,感觉不管是awt还是swing的默认字体都是不和我意,不得不自己设置字体;但是因为组件多,如果全部都有一个个加字体(像下面这样)就感觉很麻烦,代码也很冗余,所以就想着有没有办法设置全局的字体?

// 这样
JLabel jlExcel = new JLabel("请输入表格路径:");
jlExcel.setFont(new Font("宋体", Font.BOLD, 25));
JTextField jtfExcel = new JTextField(65);
jtfExcel.setFont(new Font("宋体", Font.BOLD, 23));// 或者是这样
Font textFont = new Font("宋体", Font.BOLD, 23);
jlExcel.setFont(textFont);
jtfExcel.setFont(textFont);

二、找资料

百度了一波,还真有!但是好像我还是不太懂怎么用……略颓丧,后面看了文档好像才弄懂了一点点。下面这是找到的相关博客:

1、Swing技巧. 设置全局字体(sun jdk)

为什么要这么做?
   因为java默认的字体显示中文都很难看;
   因为比如jgoodies这样的skin默认不支持中文;
   因为jdk1.4中文字体mapping有严重bug,用过IDEA的人都知道;
   因为大家只有sun的jdk可用,ibm的,bea的都不适合跑client。

if you are smart....

//设置全局字体
public static void initGlobalFontSetting(Font fnt){FontUIResource fontRes = new FontUIResource(fnt);for(Enumeration keys = UIManager.getDefaults().keys(); keys.hasMoreElements();){Object key = keys.nextElement();Object value = UIManager.get(key);if(value instanceof FontUIResource)UIManager.put(key, fontRes);}
}

if you aren't...

Font font = new Font("Dialog",Font.PLAIN,12);
UIManager.put("ToolTip.font",font);
UIManager.put("Table.font",font);
UIManager.put("TableHeader.font",font);
UIManager.put("TextField.font",font);
UIManager.put("ComboBox.font",font);
UIManager.put("TextField.font",font);
UIManager.put("PasswordField.font",font);
UIManager.put("TextArea.font",font);
UIManager.put("TextPane.font",font);
UIManager.put("EditorPane.font",font);
UIManager.put("FormattedTextField.font",font);
UIManager.put("Button.font",font);
UIManager.put("CheckBox.font",font);
UIManager.put("RadioButton.font",font);
UIManager.put("ToggleButton.font",font);
UIManager.put("ProgressBar.font",font);
UIManager.put("DesktopIcon.font",font);
UIManager.put("TitledBorder.font",font);
UIManager.put("Label.font",font);
UIManager.put("List.font",font);
UIManager.put("TabbedPane.font",font);
UIManager.put("MenuBar.font",font);
UIManager.put("Menu.font",font);
UIManager.put("MenuItem.font",font);
UIManager.put("PopupMenu.font",font);
UIManager.put("CheckBoxMenuItem.font",font);
UIManager.put("RadioButtonMenuItem.font",font);
UIManager.put("Spinner.font",font);
UIManager.put("Tree.font",font);
UIManager.put("ToolBar.font",font);
UIManager.put("OptionPane.messageFont",font);
UIManager.put("OptionPane.buttonFont",font); 

引用:Swing技巧. 设置全局字体(sun jdk)

2、java swing 界面统一设置字体样式

    /*** 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体*/private static void InitGlobalFont(Font font) {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);}}}

在main方法中,初始化窗口时,加入下面这句:

InitGlobalFont(new Font("alias", Font.PLAIN, 12));  //统一设置字体

就可以了。

注意:InitGlobalFont 这个方法的调用时在swing界面的入口界面里。

引用:java swing 界面统一设置字体样式

三、尝试解决

其实看完这两篇文章,了解到这个方法应该是可以实现我的要求的,我还是有点不太懂这个方法要放在哪个位置(InitGlobalFont 这个方法的调用时在swing界面的入口界面里???),所以就试了下:

注意下面代码中 InitGlobalFont(new Font("宋体", Font.PLAIN, 5));  //统一设置字体 的位置!

1、使用默认的字体(即不修改字体,方便对比):

package com.ys.gui;import java.awt.FlowLayout;
import java.awt.Font;
import java.util.Enumeration;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;public class TestGlobalFont {public static void main(String[] args) {JFrame jFrame = new JFrame("测试设置全局字体");// 初始化窗口init(jFrame);jFrame.setBounds(800, 400, 400, 400);jFrame.setVisible(true);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}/*** @Title init* @author yansheng* @version v1.0* @date 2019-07-01 11:28:31* @Description 初始化窗口* @param jFrame   * void */public static void init(JFrame jFrame) {FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jFrame.setLayout(flowLayout);JLabel jLabel = new JLabel("JLabel显示文本信息");jFrame.add(jLabel);JButton jButton = new JButton("JButton按钮");jFrame.add(jButton);}/*** 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体*/private static void InitGlobalFont(Font font) {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);}}}
}

注:init()方法非必须,但是好像一般都会用来初始化窗口及组件;如果自定义一个类继承JFrame或者Frame,那么在该类中一般也会用该方法,名字可自取,为方便理解这里统一命名为init。

效果图:

2、在main()方法中,定义窗口JFrame前调用:

public static void main(String[] args) {InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体JFrame jFrame = new JFrame("测试设置全局字体");
……

效果图:

3、在init()方法中,初始化窗口JFrame(未加载控件)时(即方法首行)调用:

public static void init(JFrame jFrame) {InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jFrame.setLayout(flowLayout);
……

在布局后面加也OK。

效果图:

4、反例,即该方法的调用位置不对,没有效果的情况:

4.1 在init()加载部分组件后调用:

 public static void init(JFrame jFrame) {FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jFrame.setLayout(flowLayout);JLabel jLabel = new JLabel("JLabel显示文本信息");jFrame.add(jLabel);InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体JButton jButton = new JButton("JButton按钮");jFrame.add(jButton);}

那么在它前面的加载的组件(字体设置)就会不起作用,效果如下:

4.2 在init()全部加载组件后调用(如最后一行):

 public static void init(JFrame jFrame) {FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jFrame.setLayout(flowLayout);JLabel jLabel = new JLabel("JLabel显示文本信息");jFrame.add(jLabel);JButton jButton = new JButton("JButton按钮");jFrame.add(jButton);InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体}

无效。

4.3 在main()的init()方面后面调用:

 public static void main(String[] args) {JFrame jFrame = new JFrame("测试设置全局字体");// 初始化窗口init(jFrame);InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体jFrame.setBounds(800, 400, 400, 400);jFrame.setVisible(true);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}

由4.2在init后面加都无效可知,这种肯定也不行!

5、 总结:

虽然我不是很清楚什么时候调用比较好,但是个人喜欢3在init()方法的首行调用,(个人拙见)因为init()是用初始化窗口及组件,而字体是组件的一种属性,放在一起比较容易理解。

四、进一步理解:

分析一下该方法:打印一些信息,方便理解:

 /*** 统一设置字体,父界面设置之后,所有由父界面进入的子界面都不需要再次设置字体*/private static void InitGlobalFont(Font font) {FontUIResource fontRes = new FontUIResource(font);// 打印字体信息System.out.println("fontRes:" + fontRes);for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {Object key = keys.nextElement();Object value = UIManager.get(key);if (value instanceof FontUIResource) {// 打印默认的所有有关字体的信息System.out.println("\nkey:" + key + "\nvalue:" + value);UIManager.put(key, fontRes);// 打印更改后的相关信息System.out.println("\nkey:" + key + "\nvalue:" + UIManager.get(key));}}

打印的(部分)内容:

1. 类 FontUIResource 实现 UIResource 的 java.awt.Font 的子类。设置默认字体属性的 UI 类应该使用此类。

2. UIManager 管理当前外观、可用外观集合、外观更改时被通知的 PropertyChangeListeners、外观默认值以及获取各种默认值的便捷方法。UIManager.get(Object key):从默认值中返回一个对象。

3. for循环里面,初始化:将所有默认组件(类)放到枚举对象集keys中,然后遍历keys;如果是如果该组件的值(对象)是FontUIResource的实例,就进入if语句,设置该组件的font属性。(你也可以简单理解为:只要有组件是和字体有关的,就设置它的字体为我们之前的设定好的。)

这样就OK了,达到要求:设置全局的字体。

五、拓展延伸——在全局字体的基础上加一些特殊点的字体

刚弄好全局字体,假如需求变了,还想要在全局字体的基础上加一些特殊点的字体,那怎么办呢?

直接按照普通的加上字体就好了,只要不是和全局字体一样就会显示出来,因为这个时候其实是把全局字体当做默认了,你需要特殊的,直接设置就好了。

参考:(加一个不一样字体的按钮)

 public static void init(JFrame jFrame) {InitGlobalFont(new Font("宋体", Font.PLAIN, 40)); // 统一设置字体FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT);jFrame.setLayout(flowLayout);JLabel jLabel = new JLabel("JLabel显示文本信息");jFrame.add(jLabel);JButton jButton = new JButton("JButton按钮");jFrame.add(jButton);JButton jButton1 = new JButton("这个按钮的字体是微软雅黑");jButton1.setFont(new Font("微软雅黑", Font.BOLD, 25));jFrame.add(jButton1);}

效果图:

完事。


引用:Swing技巧. 设置全局字体(sun jdk)

引用:java swing 界面统一设置字体样式

参考:设置Swing全局字体

Java Swing 设置全局的字体相关推荐

  1. linux fedora kde桌面设置全局显示字体大小

    linux fedora kde桌面设置全局显示字体大小

  2. JAVA Swing——设置JButton按钮样式

    1.对JButton大小的设置 因为JButen是属于小器件类型的,所以一般的setSize不能对其惊醒大小的设置,所以一般我们用 button.setPreferredSize(new Dimens ...

  3. uniapp二次封装slider滑块实现刻度尺设置全局页面字体大小

    前言 uniapp没有现成的刻度尺滑块实现调整字体大小的功能,通过找到u-view的slider滑块来实现刻度尺方式设置全局字体大小的二次封装. 总体思路:通过刻度尺的方式选择用户合适的字体效果,上面 ...

  4. java文本框设置字体样式,java Swing设置文本框文字颜色和字体

    在java中文本编辑器单独设置文字的控件有个JTextPane,而通常使用的JTextArea似乎不能设置所选文字的颜色和字体. //实例化一个文本编辑的控件 JTextPane editorPane ...

  5. java如何设置成中文字体,Java程序中文字体配置

    出自Linux Wiki 提示:此文已超过 8 年(3003 天)未更新,如发现内容过时或有误,欢迎改进:) 在Linux中,JAVA程序的中文默认可能不正常:或是显示为方框,或是不够清晰.这是由于J ...

  6. java swing 字体显示_如何在Java Swing中使用Wingdings字体

    当我尝试使用Wingdings字体(或其他符号字体)时,文本显示为矩形而不是正确的文本.如何显示正确的字符? import java.awt.*; import javax.swing.*; publ ...

  7. Java swing设置jar包开机启动

    参考文章:java实现Windows开机自启动 java创建桌面图标快捷方式 StartupDemo.java package org.fiend.swing.test.demo.startup.te ...

  8. Java Swing设置图标Icon

    正好这次实习要求有个要用swing做界面,于是重新拾起Swing了,发现好多都忘了... 现在貌似Swing用的人很少了. // 设置窗口图标 protected void setWindowIcon ...

  9. java swing 设置背景_swing-窗体添加背景图片的2种方法

    在美化程序时,常常需要在窗体上添加背景图片.通过搜索和测试,发现了2种有效方式.下面分别介绍. 1.利用JLabel加载图片 利用JLabel自带的setIcon(Icon icon)加载icon,并 ...

最新文章

  1. 文档null一段 虚拟机操作
  2. python调用math函数_Python中sqrt函数使用方法
  3. Android 3D emulation 架构理解
  4. 技术应用丨DWS 空间释放(vacuum full) 最佳实践
  5. Action详解(一)
  6. android studio 中使用lambda表达式
  7. maven 教程入门 maven 配置管理 编译java程序
  8. python添加重复元素_在Python 3.6中添加迭代时重复元素
  9. 王者荣耀交流协会 — Alpha阶段中间产物
  10. stopwords怎么用_【技术】怎么用Python画出好看的词云图?
  11. Keil C51大工程建立,模块化编程
  12. Windows装机必备软件
  13. IBM SPSS Modeler 【4】 神经网络模型的测试验证
  14. MySQL系统认识与使用-----最全MySQL应用
  15. java 二进制加减_二进制加法Java实现
  16. 基于FPGA的LED全彩图形显示控制器设计
  17. 心态-《生活的艺术》书中的精髓:中国人享受生活,所以有着独特的生活的艺术,享受生活首先要有闲暇时光,也要去感受生活,才会体验到生活的乐趣
  18. ENVI 5.1设置影像背景值透明显示
  19. 缓冲、缓冲区、缓存三者的区别
  20. Windows 7系统如何更改用户账户控制设置?

热门文章

  1. SpringMVC总结-SpringMVC的运行流程以及简单运用
  2. 一款开源的PHP邮箱系统
  3. spring切入点函数
  4. png格式图片 转 icns格式图标
  5. 淘宝新店没有生意如何推广和引流呢
  6. css overflow
  7. Homekit智能家居DIY一WIFI智能插座
  8. 61、弱电工程数据中心的网络架构及其设计思路
  9. 18、弱电工程综合布线系统常用的线材及设备图文资料
  10. magento添加sku_快速提示:如何将优惠券添加到Magento电子商务商店