最近在学习JavaFX PC端软件开发,在Linux上显示一切正常,打算周末在macbook上接着实践时,发现UI跑起来却成了这样的一团乱码:
部分UI出现了乱码。
立即Google查找问题的解决方法,发现很多都是从文件编码格式之类的入手,然而我很确定我的文件编码方式是正确,这显然并不是我所出现的问题的解决办法。
再看IDE是否有有意义的提示,果然发现了这么一个警告:
2021-12-04 11:17:44.431 java[74061:16444439] CoreText note: Client requested name ".SFNS-Regular", it will get Times-Roman rather than the intended font. All system UI font access should be through proper APIs such as CTFontCreateUIFontForLanguage() or +[NSFont systemFontOfSize:].
看起来似乎时.SFNS-Regular这个字体在我的macos上不存在,JavaFX自作主张地使用了Times-Roman代替了,而后者并没有双字节的中文字符,因此会有单字节对应的索引的字体代替,这就是乱码的根本原因。于是,我在场景中插入:
scene.getRoot().setStyle("-fx-font-family: 'serif'");
使用这个javafx-css强迫界面字体使用macos所拥有的中文字体进行显示,则乱码可以得到恢复: